prop和full property的区别是什么?

本文关键字:区别 是什么 property full prop | 更新日期: 2023-09-27 18:08:37

下面这两段代码有什么区别吗?或者顶部只是底部的缩略形式?

public string Name { get; set; }

private string _Name;
public string Name
{
    get { return _Name; }
    set { _Name = value; }
}

prop和full property的区别是什么?

唯一的区别(除了您必须在类构造函数中使用"Default Name"进行初始化)是_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。因此,如果您返回属性值而没有使用FULL property方法初始化,它将始终返回空字符串而不是NULL值。

我认为编译后的代码没有任何区别。如果你想添加一个默认值(这可以在构造函数中以简写形式完成),或者在getter或setter

中添加额外的代码,那么你可能想要使用完整的方法。编辑:实际上,你的代码是错误的,它应该是
private string _Name;
public string Name
{
   get { return _Name; }
   set { _Name = value; }//change here
}

不…

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; }

对于所写的示例,它们是完全等价的。

自动实现的属性是语法糖,正是为了解决这类情况而引入的,在这种情况下,使用属性只是为了避免拥有公共字段,在getter/setter中没有额外的逻辑。但是,自动实现的属性为您提供了属性的所有好处,包括元数据。这是一个相当古老但仍然相关的链接,它解释了更多关于它们的信息。

在后台,编译器生成一个与您自己的非常相似的后备字段。