正确使用属性和自动实现的属性?

时间:2018-09-04 08:04:54

标签: c# properties

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

1 个答案:

答案 0 :(得分:2)

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