这两者当然不是等价的。
public string FirstName;
public string FirstName { get; set; }
第一个是一个典型的field,就像一个普通的 C++class
成员。
第二个是属性。更具体地说,它是一个自动实现的属性。属性本质上只是函数_get()
和_set(value)
函数的语法糖,就像在 Java 中使用的那样。自动实现的属性更进一步,并隐藏了为您保存数据的支持字段。
由于您应该为公共 API 使用属性而不是字段,因此许多 .NET 框架/API(如MVC、EF等)将对类的属性执行特殊操作(例如自动创建数据库模式) .
为什么要使用属性?考虑以下示例。你有一个简单的 jane 类,具有自动实现的属性。
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 保持不变。这只是属性绝对是“正确选择”的一个例子。