Accessors behavior in c# is doubtful
本问题已经有最佳答案,请猛点这里访问。
是声明吗
1 | public string FirstName; |
相当于
1 | public string FirstName { get; set;} |
我相信没有什么不同,但我发现了以下几点:当我创建了一个模型-类似于这样
1 2 3 4 | public class Subject { public string SubjectName;// { get; set; } } |
然后在MVC中使用表单发布这个对象,我得到
它不是等价的代码。有很大的区别-如果没有访问器,您就拥有公共字段,而访问器则拥有自动实现的属性。MVC、WPF、Entitiy Framework等需要属性(在MVC中,默认模型绑定器仅与属性一起工作)。参见属性与字段-为什么重要?
这两个肯定不是等价的。
1 2 3 | public string FirstName; public string FirstName { get; set; } |
第一个是一个典型的字段,就像一个普通的C++ C++ EDCOX1×0成员。
第二种是财产。更具体地说,它是一个自动实现的属性。属性基本上是EDOCX1的1的语法糖和EDCX1的2个函数,就像一个在Java中使用的。自动实现的属性更进一步,隐藏为您保存数据的备份字段。
由于您应该为公共API使用属性而不是字段,因此许多.NET框架/API(如MVC、EF等)都会对类的属性进行特殊处理(例如自动创建数据库架构)。
为什么要使用属性?考虑下面的例子。您有一个普通的Jane类,它有一个自动实现的属性。
1 2 3 | public class Foo { public int Bar { get; set; } } |
你有一些客户代码:
1 2 | var f = Foo(); f.Bar = 32; |
假设您想添加一个事件,当您在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Foo { private int m_bar; public int Bar { get { return m_bar; } set { m_bar = value; OnChanged(); } } public event EventHandler Changed; protected virtual void OnChanged() { var evt = Changed; if (evt != null) evt(this, EventArgs.Empty); } } |
还有(重要的部分!)面向客户端的API保持不变。这只是属性绝对是"正确选择"的一个例子。
场
1 | public string SubjectName; |
财产
1 | public string SubjectName { get; set; } |
两者都有相同的价值,但它们是不同的。