是声明
public string FirstName;
相当于
public string FirstName { get; set;}
我相信没有区别,但我发现了以下内容:当我创建一个模型时 - 就像这样
public class Subject
{
public string SubjectName;// { get; set; }
}
然后在MVC中使用表单发布此对象,我得到SubjectName
值null
。但是,如果我删除注释的访问器,那么我得到一个值。这种行为有什么理由吗?
答案 0 :(得分:5)
它不是等效的代码。存在很大差异 - 如果没有访问者,您可以公开field,而访问者则自动实施property。 MVC,WPF,Entitiy Framework等需要属性(在MVC默认模型绑定器中仅适用于属性)。见Properties vs Fields – Why Does it Matter?
答案 1 :(得分:4)
这两个肯定是不等同于
。public string FirstName;
public string FirstName { get; set; }
第一个是典型的field,就像普通的C ++ class
成员一样。
第二个是property。更具体地说,它是auto-implemented property。属性基本上只是_get()
和_set(value)
函数的语法糖,就像在Java中习惯的那样。自动实现的属性更进一步,隐藏支持字段,为您保存数据。
由于您假定使用属性而非字段,因此对于您的公共API,许多.NET框架/ API(如MVC,EF等)将会使用类的属性执行特殊事物(例如,自动创建数据库模式)。
为什么要使用属性?请考虑以下示例。你有一个简单的类,有一个自动实现的属性。
public class Foo {
public int Bar { get; set; }
}
你有一些客户代码:
var f = Foo();
f.Bar = 32;
假设您要添加在Foo
中更改内容时触发的事件。由于您使用了属性,因此您只需更改实现:
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保持不变。这只是属性绝对是“正确选择”的一个例子。
答案 2 :(得分:1)
字段
public string SubjectName;
财产
public string SubjectName { get; set; }
两者都提供相同的价值,但它们是不同的。