公有字段与自动属性

我们经常被告知我们应该通过为类字段创建getter和setter方法(C#中的属性)来保护封装,而不是将字段暴露给外部世界。

但是有很多时候,一个字段只是在那里保存一个值,并且不需要任何计算来获取或设置。 对于这些我们都会做这个数字:

public class Book
{
    private string _title;

    public string Title
    {
          get{ return _title;  }
          set{ _title = value; }
    }
}

那么,我有一个坦白的说法,我无法忍受写下所有这些(实际上,它不必写它,它不得不看它),所以我去流氓并使用公共领域。

接下来是C#3.0,我看到他们添加了自动属性:

public class Book
{
    public string Title {get; set;} 
}

这很整洁,我很感谢它,但是真的,和公共领域有什么不同?

public class Book
{
    public string Title;
}

在一段时间以前的相关问题中,Jeff的博客上有一个链接,解释了一些不同之处。

属性与公共变量

  • 反射对变量和属性的作用是不同的,所以如果你依赖反射,使用所有属性会更容易。
  • 你不能对一个变量进行数据绑定。
  • 将变量更改为属性是一个突破性变化。 例如:

    TryGetTitle(out book.Title); // requires a variable
    

  • 忽略API问题,我发现使用属性最有价值的是调试。

    CLR调试器不支持数据中断点(大多数本机调试器都这样做)。 因此,无法在读取或写入某个类的特定字段时设置断点。 这在某些调试场景中非常有限。

    因为属性是以非常细的方式实现的,所以可以在读取和写入它们的值时设置断点。 这给了他们在田野上的一大步。


    仅仅因为没有人提到它:你不能在接口上定义字段。 所以,如果你必须实现一个定义属性的特定接口,自动属性有时是一个非常好的功能。

    链接地址: http://www.djcxy.com/p/22891.html

    上一篇: Public Fields versus Automatic Properties

    下一篇: Properties vs. Fields: Need help grasping the uses of Properties over Fields