具有空访问器或不具有访问器的属性之间的差异
本文关键字:访问 之间 属性 | 更新日期: 2023-09-27 18:31:24
具有空访问器的属性与不具有访问器的属性之间的差异?
// Property with empty accessors
public string Name { get; set; }
// Property without accessor
public int Counter;
编辑:
除了编译器的声明之外的含义意味着这样
实际上第二个不是财产,而是公共领域。
C# 中的属性只是两种类型的方法的快捷方式 - 访问器和突变器(或 get 和 set)。所以,当你写一些属性时,比如
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
),编译器不会生成任何方法。
对于你的第二个问题:C# 中的字段和属性有什么区别
因为属性实际上是一种方法,所以它们可以是抽象的或虚拟的,可以被覆盖。属性可以是接口的一部分。属性可用于数据绑定。您可以向属性添加任何逻辑(例如,引发某些事件、延迟加载或执行验证)。您可以定义不同的访问级别来设置和获取属性(例如私有和公共)。对于公共领域来说,这一切都不是真的。
对于第一个编译器将生成私有字段,例如:
private string _name;
public string Name { get {return _name;} set { _name = value; } }
第二个只是一个公共领域。
此外,您可以重写派生类中的属性(在字段的情况下,您不能)。
对SO的含义有很好的解释:为什么公共领域比属性更快?
public string Name { get; set; }
此语法将创建一个自动属性。这是一个速记,相当于这个:
private string _name;
public string Name
{
get
{
return this._name;
}
set
{
this._name = value;
}
}
这与以下语法不同:
public string Name;
这将创建一个公共字段。
不同之处在于,字段是内存块,属性实际上是在实例上获取或设置值的方法的简写。虽然两者的行为似乎相同,但它们却有微妙的不同。
一般来说,您希望使用所有面向公众的值的属性,因为它们是围绕您自己的内部实现的抽象。如果您想稍后将属性的内部 getter 实现更改为更复杂的内容,则不会更改类的公共接口,并且使用类的任何内容都看不到更改。
通常,您将始终希望为公共成员使用属性。这样做没有实际成本,它使您的对象更易于维护。