下面这两段代码有区别吗?还是说上面的只是下面一段的简写形式?
public string Name { get; set; }
并且private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
下面这两段代码有区别吗?还是说上面的只是下面一段的简写形式?
public string Name { get; set; }
并且private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
_Name
只能在类内部可见。如果类内部直接引用_Name
而不是Name
,一切都会正常工作,但稍后如果你在Name
中添加一些逻辑,由于类内部使用的是_Name
,这些逻辑将不会被调用。private string _Name = "Default Name";
public string Name
{
get { return _Name.Left(42); } // Changed the getter
set { _Name = value; }
}
void MyOtherMethod()
{
string foo = _Name; // Referencing the private field accidentally instead of the public property.
// Do something with foo
}
属性方法的基本行为和目的几乎相同。但主要区别在于实现方式。两种方法之间的区别在于
public string Name{get;set;}
并且
private string _Name;
public string Name
{
get { return _Name; }
set { _Name=value; }
}
如果您使用短属性语法(在框架3.0或更高版本中引入) ,则该属性字符串永远不会初始化,即如果您在任何地方直接使用“Name”属性而没有将值设置为它,则它将返回一个NULL值。但是,如果您使用第二种语法来初始化属性值,则它将返回一个空字符串,因为当您初始化一个字符串时,它被初始化为一个空值而不是NULL。因此,如果您使用完整的属性方法返回属性值而没有使用初始化,则它将始终返回一个空字符串而不是NULL值。
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }//change here
}
not...
value = _Name;
其中一个区别是,当您这样做时,可以在私有字符串上设置默认值。
private string _Name = "Default Name";
public string Name
{
get { return _Name; }
set { value = _Name; }
}
一旦编译完成,你展示的这两个例子就是相同的。
对于第二种形式的特定实现,两者是等价的。因为如果你只写第一种形式,编译器将生成几乎相同的代码。
也就是说,编译器会添加代码:
public string Name{get;set;}
使它看起来像这样:
private string generatedCode_Name;
public string Name
{
get { return generatedCode_Name; }
set { generatedCode_Name = value; }
}
顺便说一下,这是不正确的
set { value = _Name; } //I believe its a typo!
我想你的意思是:
set { _Name = value; }
这只是一个简单的表单,底层变量仍然作为支持后备字段生成(数据存储的位置),但自动生成 - 如果你只是获取和设置,而不需要在任何访问器中具体实现细节,这是非常有用的。
对于所写的示例,它们是完全等效的。
自动实现属性是一种语法糖,用于解决恰好这种类型的情况,在该情况下,属性仅用于避免具有无额外逻辑的公共字段的情况。然而,自动实现属性为您提供了所有属性的好处,包括元数据。这是一个相当古老但仍然相关的链接,更详细地解释了它们。
在幕后,编译器生成一个类似于您自己的后备字段。