在.NET中的Getter和Setter声明

我想知道这些声明的getter和setter之间有什么区别,以及是否有一个首选的方法(以及为什么)。 第一个可以由Visual Studio自动生成。 其他人怎么样? 谢谢

1

string _myProperty { get; set; } 

第2

 string _myProperty; public string myProperty { get { return _myProperty; } set { _myProperty = value; } } 

第3

 string _myProperty; public getMyProperty() { return this._myProperty; } public setMyProperty(string value) { this._myProperty = value; } 

属性被用来封装一些数据。 你可以使用一个普通的字段:

 public string MyField 

但是这个字段可以被你class上的所有外部用户访问。 人们可以插入非法的价值或以您不希望的方式改变价值。

通过使用属性,可以封装数据的访问方式。 C#有一个很好的把字段转换成属性的语法:

 string MyProperty { get; set; } 

这被称为自动实施的财产 。 当需要出现时,您可以将您的财产扩展到:

 string _myProperty; public string MyProperty { get { return _myProperty; } set { _myProperty = value; } } 

现在,您可以添加validation您setter值的代码:

 set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(); _myProperty = value; } 

属性对于getter和setter也可以有不同的访问器:

 public string MyProperty { get; private set; } 

这样你就可以创build一个可以被所有人阅读的属性,但是只能被类本身修改。

你也可以为你的getter添加一个完全自定义的实现:

 public string MyProperty { get { return DateTime.Now.Second.ToString(); } } 

当C#编译自动实现的属性时,它会生成中间语言(IL)。 在你的IL你会看到一个get_MyPropertyset_MyProperty方法。 它还创build了一个叫做<MyProperty>k_BackingField的背景字段( <MyProperty>k_BackingField (通常这在C#中是非法的名字,但在IL中是有效的,这样你就不会在生成的types和你自己的代码之间产生任何冲突)。 但是,您应该在C#中使用官方属性语法。 这在C#中创造了更好的体验(例如使用IntelliSense)。

按照惯例,您不应该使用属性进行需要很长时间的操作。

那么第一个和第二个都会产生类似于第三个的东西。 但是,不要使用第三个属性的语法。

最后,如果你在getset没有工作,那么使用第一个。

最后,第一个和第二个只是语法糖的某种forms,但为什么代码比什么是必要的。

 // more code == more bugs 

为了有一点乐趣,考虑一下:

 public string A { get; private set; } 

现在这是更直截了当的不是吗? public修饰符隐含getset ,但是可以被overriden。 这当然是定义属性本身时使用的任何修饰符的相同规则。

1

 string _myProperty { get; set; } 

这在.NET世界中被称为自动属性 。 这只是#2的语法糖。

第2

 string _myProperty; public string myProperty { get { return _myProperty; } set { _myProperty = value; } } 

这是通常的做法,如果你需要在你的财产中做任何validation或额外的代码,这是必需的。 例如,在WPF中,如果您需要触发Property Changed事件。 如果你不这样做,只需使用自动属性,这是非常标准的。

3

 string _myProperty; public string getMyProperty() { return this._myProperty; } public string setMyProperty(string value) { this._myProperty = value; } 

this关键字是多余的。 根本不需要。 这些只是获取和设置的方法,而不是属性,如Java的做事方式。

只是为了澄清,在你的第三个例子_myProperty实际上不是一个属性。 这是一个get和set方法的字段(并且已经提到了get和set方法应该指定返回types)。

在C#中,大多数情况下应避免使用第三种方法。 如果你想返回的types是一个数组,或者如果get方法做​​了很多工作,而不是仅仅返回一个值,那么你只能真正使用它。 后者并不是真正必要的,但是为了清楚起见,一个属性的get方法做​​了很多工作是误导性的。

有了这个,你可以在getset范围内执行一些代码。

 private string _myProperty; public string myProperty { get { return _myProperty; } set { _myProperty = value; } } 

你也可以使用自动属性:

 public string myProperty { get; set; } 

.Net Framework将为您pipe理。 这是创造,因为这是一个很好的实践,并使其容易做到。

您还可以控制这些范围的可见性,例如:

 public string myProperty { get; private set; } public string myProperty2 { get; protected set; } public string myProperty3 { get; } 

更新

现在在C#中,您可以初始化一个属性的值。 示例:

 public int Property { get; set; } = 1; 

如果还可以定义它,使其只读,没有一套。

 public int Property { get; } = 1; 

最后,你可以定义一个箭头函数。

 public int Property { get; } => GetValue(); 

第一个是默认的,没有什么特别的要返回或写入。 第二和第三是基本相同的地方,第三是多一点扩大版本的第二

让我们从3开始,这不会工作。 public getMyProperty()没有返回types。

而数字1和2实际上是一样的东西。 2是编号后编号为1的数字。

所以1和2是一样的东西。 有两个你可以在你的模型中有一些validation或caching。

除了它们变得一样。

第一个是“短”forms – 当你不想对你的获得者和制定者做某事时,你就使用它。 在这种forms下执行一个方法或类似的东西是不可能的。

第二种和第三种forms几乎完全相同,尽pipe第二种forms压缩到一行。 这种forms是由stylecop劝阻,因为它看起来有点古怪,不符合C'Stylguides。

我会使用第三种forms,如果我希望使用我的getters / setters的特殊的东西,例如使用一个懒惰的构造左右。