首页 > 解决方案 > 正确使用属性和自动实现的属性?

问题描述

我只在“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;
}

标签: c#properties

解决方案


这个问题可能更适合 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;
}

至于是使用字段支持的属性、自动属性还是计算属性……这取决于您根据属性应该做什么来决定。自动属性适用于简单地存储和检索值,例如PublishedHeadline此处。只要您在 getter 和 setter 中执行的操作不仅仅是读取或写入它,您就需要显式支持字段,如Content. RenderedContent可能只是一个计算属性,但我选择在初始转换后缓存该值,因为你有点这样做。不过,这里的这种模式在实际需要之前不会转换 Markdown。


推荐阅读