在.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_MyProperty
和set_MyProperty
方法。 它还创build了一个叫做<MyProperty>k_BackingField
的背景字段( <MyProperty>k_BackingField
(通常这在C#中是非法的名字,但在IL中是有效的,这样你就不会在生成的types和你自己的代码之间产生任何冲突)。 但是,您应该在C#中使用官方属性语法。 这在C#中创造了更好的体验(例如使用IntelliSense)。
按照惯例,您不应该使用属性进行需要很长时间的操作。
那么第一个和第二个都会产生类似于第三个的东西。 但是,不要使用第三个属性的语法。
最后,如果你在get
或set
没有工作,那么使用第一个。
最后,第一个和第二个只是语法糖的某种forms,但为什么代码比什么是必要的。
// more code == more bugs
为了有一点乐趣,考虑一下:
public string A { get; private set; }
现在这是更直截了当的不是吗? public
修饰符隐含在get
和set
,但是可以被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方法做了很多工作是误导性的。
有了这个,你可以在get
或set
范围内执行一些代码。
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的特殊的东西,例如使用一个懒惰的构造左右。
- Visual Studio构build失败:无法将exe文件从obj \ debug复制到bin \ debug
- 为什么C#结构是不可变的?
- 如何build立在C#中的URL的查询string?
- 在运行时dynamic生成DLL程序集
- WCF ExceptionShielding错误ID不匹配与handlingInstanceId传递给处理程序
- 在ASP.NET MVC中更改视图的布局(主页)而不重新创build它
- 你如何循环通过当前加载的程序集?
- 获取Windows 8自动颜色主题的活动颜色
- 通常最好使用 – StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?