注意:这是在我开始使用C#时发布的.凭借2014年的知识,我可以真正地说,自动属性是C#语言中发生过的最好的事情.
我习惯使用私有和公共字段在C#中创建我的属性:
private string title; public string Title { get { return title; } set { title = value; } }
现在,使用.NET 3.0,我们获得了自动属性:
public string Title { get; set; }
我知道这更像是一个哲学/主观问题,但除了为每个字段保存五行代码之外,是否有任何理由使用这些自动属性?我个人的抱怨是那些属性隐藏了我的东西,我不是黑魔法的忠实粉丝.
事实上,隐藏的私有字段甚至没有显示在调试器中,这是好的,因为get/set函数什么都不做.但是当我想实际实现一些getter/setter逻辑时,我必须使用私有/公共对.
我看到了我节省大量代码(一对六行)而不会失去以后更改getter/setter逻辑的能力的好处,但是我再次通过简单地声明一个公共字段"Public string Title"就可以做到这一点需要{get; 组; 阻止,因此甚至可以节省更多代码.
那么,我在这里错过了什么?为什么有人真的想要使用自动属性?
我们一直在Stack Overflow中使用它们.
您可能还对" 属性与公共变量"的讨论感兴趣.恕我直言,这真的是对此的反应,为此目的,它是伟大的.
是的,它只是保存代码.当你有大量的东西时,阅读起来更容易.它们编写起来更快,更易于维护.保存代码始终是一个很好的目标.
您可以设置不同的范围:
public string PropertyName { get; private set; }
因此,只能在类内更改属性.这不是真正不可变的,因为您仍然可以通过反射访问私有的setter.
从C#6开始,您还可以创建真正的readonly
属性 - 即不能在构造函数外部更改的不可变属性:
public string PropertyName { get; } public MyClass() { this.PropertyName = "whatever"; }
在编译时将成为:
readonly string pName; public string PropertyName { get { return this.pName; } } public MyClass() { this.pName = "whatever"; }
在具有大量成员的不可变类中,这可以节省大量多余的代码.
使用字段而不是属性的三大缺点是:
你不能数据绑定到一个字段,而你可以到一个属性
如果您开始使用字段,则以后(轻松)将它们更改为属性
您可以将某些属性添加到无法添加到字段的属性中
我个人喜欢自动财产.保存代码行有什么问题?如果你想在getter或setter中做一些事情,以后将它们转换为普通属性是没有问题的.
正如你所说,你可以使用字段,如果你想在以后添加逻辑,你可以将它们转换为属性.但这可能会出现任何使用反射的问题(可能还有其他地方?).
此外,属性还允许您为getter和setter设置不同的访问级别,而不能使用字段.
我猜它和var关键字一样.个人喜好的问题.
来自Bjarne Stroustrup,C++的创建者:
我特别不喜欢有很多get和set函数的类.这通常表明它本来不应该是一个阶级.它只是一个数据结构.如果它确实是一个数据结构,那就把它变成一个数据结构.
你知道吗?他是对的.你经常在get和set中简单地包装私有字段,而不是实际在get/set中做任何事情,只是因为它是"面向对象"的事情.这是微软解决问题的方法; 它们基本上是你可以绑定的公共字段.
似乎没有人提到的一件事是,不幸的是,自动属性对于不可变对象(通常是不可变的结构)没有用处.因为你真的应该这样做:
private readonly string title; public string Title { get { return this.title; } }
(通过传递的参数在构造函数中初始化字段,然后是只读的.)
因此,这比简单get
/自动配置更具优势private set
.
我总是创建属性而不是公共字段,因为您可以在接口定义中使用属性,不能在接口定义中使用公共字段.
自动属性与C#中的其他任何东西一样具有黑魔法.一旦你从编译到IL而不是将它扩展到普通的C#属性的角度考虑它,首先它比许多其他语言结构要少得多.
我一直都在使用自动属性。在C#3之前,我不会为所有类型感到烦恼,而只是使用了公共变量。
我唯一想念的是能够做到这一点:
public string Name = "DefaultName";
您必须将默认值转移到带有属性的构造函数中。乏味的:-(
我认为任何直观且能减少代码行的构造都是一个很大的优点。
这些功能使Ruby之类的语言如此强大(具有动态功能,这也有助于减少多余的代码)。
Ruby一直这样:
attr_accessor :my_property attr_reader :my_getter attr_writer :my_setter