具有空访问者或没有访问者的属性之间的区别?
// Property with empty accessors
public string Name { get; set; }
// Property without accessor
public int Counter;
超出编译器声明的含义意味着这样的
答案 0 :(得分:4)
实际上,第二个不属于公共领域。
C#中的属性只是两种方法的快捷方式 - 访问器和增变器(或获取和设置)。所以,当你写一些像
这样的属性时private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
编译器实际上会创建两个方法
public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }
写作时
public string Name { get; set; }
然后编译器将生成这两种方法并为您生成后备存储(字段_name
)。
当您不使用get
和set
时,它就是简单字段(如_name
),编译器不会生成任何方法。
对于你的第二个问题: What is the difference between a field and a property in C#
因为属性实际上是一个方法,它们可以是抽象的或虚拟的,可以被覆盖。属性可以是接口的一部分。属性可用于数据绑定。您可以向属性添加任何逻辑(例如,引发某些事件,延迟加载或执行验证)。您可以为设置和获取属性定义不同的访问级别(例如私有和公共)。这一切都不适用于公共领域。
答案 1 :(得分:3)
将生成私有字段,例如:
private string _name;
public string Name { get {return _name;} set { _name = value; } }
第二个只是一个公共领域。
此外,您可以覆盖派生类中的属性(如果是字段,则不能)。
对SO的含义有很好的解释:Why are public fields faster than properties?
答案 2 :(得分:0)
public string Name { get; set; }
此语法将创建一个自动属性。这是一个简写,相当于:
private string _name;
public string Name
{
get
{
return this._name;
}
set
{
this._name = value;
}
}
这与此语法不同:
public string Name;
这会创建一个公共字段。
不同之处在于,如果字段是内存块,则属性实际上是获取或设置实例值的方法的简写。虽然两者似乎具有相同的行为,但它们略有不同。
一般来说,您希望使用所有面向公众的值的属性,因为它们是您自己内部实现的抽象。如果你想将你的属性的内部getter实现改为以后更复杂的东西,那么你的类的公共接口没有变化,并且对你使用类的任何东西都不会看到这种变化。
一般来说,您总是希望为公共成员使用属性。这样做没有实际成本,它使您的对象更容易维护。