c# - 正确使用属性和自动实现的属性?
问题描述
我只在“Essential C#”的第 5 章,不确定我是否正确理解了其中的区别。我试图制作下面的模型来测试属性一章中所有内容的一个实例 - 它可以工作 - 但是该示例是否可以接受使用可以实现属性的两种方式还是有更好的方法?
using MarkdownSharp; // StackOverflow's md processor
public class Article
{
public string Headline { get; set; }
public string Content
{
get
{
return _content;
}
set
{
var md = new Markdown();
var html = md.Transform(value);
_content = html;
}
}
private string _content;
public DateTime Published { get; set; } = DateTime.Now;
}
解决方案
这个问题可能更适合 codereview.stackexchange,尽管它可能是一个片段太小并且无法对此提出模糊的问题。
就个人而言,我回避以令人惊讶的方式起作用的魔法属性。它倾向于使 API 难以使用,因为它们令人惊讶,即使它们在某种程度上是“聪明的”。你有一个属性,你设置的值与你得到的值不同。这可能会破坏的一件事是+=
操作员,它会突然以非常奇怪的方式与您的Content
财产一起工作。
我可能会选择类似的东西
public class Article
{
private string content;
private string renderedContent;
public string Headline { get; set; }
public string Content
{
get { return content; }
set
{
content = value;
renderedContent = null; // reset cached rendered content
}
}
public string RenderedContent
{
get
{
if (renderedContent == null)
{
renderedContent = new Markdown().Transform(content);
}
return renderedContent;
}
}
public DateTime Published { get; set; } = DateTime.Now;
}
至于是使用字段支持的属性、自动属性还是计算属性……这取决于您根据属性应该做什么来决定。自动属性适用于简单地存储和检索值,例如Published
或Headline
此处。只要您在 getter 和 setter 中执行的操作不仅仅是读取或写入它,您就需要显式支持字段,如Content
. RenderedContent
可能只是一个计算属性,但我选择在初始转换后缓存该值,因为你有点这样做。不过,这里的这种模式在实际需要之前不会转换 Markdown。
推荐阅读
- javascript - Angular 9 新的 YouTube 播放器组件 - 如何跳转到新的 startSeconds
- python - php curl请求的python版本
- php - 如何在 HTML 表格中使用 PHP 回显图像
- javascript - 将伪造数据部署到heroku
- python-3.x - 如何从数组转换为熊猫 df?
- c# - 针对不同返回类型的 C# 策略设计模式
- django - Django TemplateSyntaxError: 无法解析余数:'"{%' from '"{%'
- mvvm - Xamarin Forms 将视图与视图模型和视图模型与服务绑定
- swagger - Swagger 抛出“无法解析参考”
- azure-data-explorer - Kusto 查询 - 转换列表列的项目