道具和完整财产之间有什么区别?

时间:2011-09-15 16:32:01

标签: c# properties

大家好,以下两段代码有什么区别吗?或者顶部只是底部的一个简短形式?

public string Name{get;set;}

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

7 个答案:

答案 0 :(得分:9)

唯一的区别(除了你必须在类构造函数中使用“默认名称”进行初始化的事实)是_Name将在类本身中可见。有一个风险,类会在内部引用_Name而不是Name,一切都会正常工作,并且在稍后的某个时间点你会添加一些逻辑给Name,因为你在类中使用了_Name而不会被调用。 / p>

示例:

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
}

答案 1 :(得分:3)

我认为编译代码没有任何区别。您可能想要完整的方法是,如果要添加默认值(可以在构造函数中以简写形式完成),或者向getter或setter添加其他代码

编辑:实际上,你的代码应该是错的

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

...不

value = _Name;

答案 2 :(得分:3)

两种属性方法的基本行为和目的几乎相同。但主要的区别在于实施。

之间的区别
public string Name{get;set;}

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

如果你使用短属性语法(在框架3.0或更高版本中引入),那么属性sting永远不会被初始化,即如果你在没有设置值的情况下直接使用“Name”属性,它将返回NULL值。但是,如果使用第二种语法初始化属性值,它将返回EMPTY字符串,因为在初始化字符串时,它使用EMPTY值而不是NULL进行初始化。因此,如果在没有使用FULL属性方法初始化的情况下返回属性值,它将始终返回EMPTY字符串而不是NULL值。

答案 3 :(得分:1)

它只是一个简短的形式,底层变量仍然作为支持后备字段(存储数据的位置)生成,但是自动生成 - 如果您只是简单地获取和设置并且不需要任何特定内容,这将非常有用访问者中的实现细节。

答案 4 :(得分:1)

对于第二种形式的这种特定实现,两者都是等价的。因为如果你只是编写第一个表单,编译器将生成几乎相同的代码。

也就是说,编译器将向其添加代码:

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

答案 5 :(得分:1)

一个区别是,您可以在执行此操作时在私有字符串上设置默认值

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

编译后,您展示的两个示例是相同的。

答案 6 :(得分:0)

对于编写的示例,它们是完全等效的。

Auto-implemented properties是引入的语法糖,用于解决这些类型的情况,其中该属性仅用于避免使用公共字段,而在getter / setter中没有额外的逻辑。但是,自动实现的属性为您提供属性的所有好处,包括元数据。这是一个相当old but still relevant link,更多地解释了它们。

在幕后,编译器会生成一个非常类似于您自己的支持字段。