.NET 中的 getter 和 Setter 声明
本文关键字:Setter 声明 getter 中的 NET | 更新日期: 2023-09-27 18:25:13
我想知道那些getters和setters的声明之间有什么区别,是否有首选方法(以及为什么(。第一个可以由Visual Studio自动生成。其他人呢?谢谢
第一
string _myProperty { get; set; }
第二
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
第三
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public void setMyProperty(string value)
{
this._myProperty = value;
}
属性用于封装某些数据。您可以使用普通字段:
public string MyField
但是,您类的所有外部用户都可以访问此字段。人们可以插入非法值或以您意想不到的方式更改值。
通过使用属性,可以封装访问数据的方式。C# 有一个很好的语法,可以将字段转换为属性:
string MyProperty { get; set; }
这称为自动实现的属性。当需要时,您可以将您的财产扩展到:
string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
现在,您可以添加验证setter
中的值的代码:
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException();
_myProperty = value;
}
属性还可以具有不同的 getter 和 setter 访问器:
public string MyProperty { get; private set; }
通过这种方式,您可以创建一个每个人都可以读取但只能由类本身修改的属性。
您还可以为getter
添加完全自定义的实现:
public string MyProperty
{
get
{
return DateTime.Now.Second.ToString();
}
}
当 C# 编译自动实现的属性时,它会生成中间语言 (IL(。在 IL 中,您将看到get_MyProperty
和set_MyProperty
方法。它还创建一个名为 <MyProperty>k_BackingField
的支持字段(通常这在 C# 中是非法名称,但在 IL 中它是有效的。这样,生成的类型和您自己的代码之间就不会发生任何冲突(。但是,您应该使用 C# 中的官方属性语法。这会在 C# 中创建更好的体验(例如,使用 IntelliSense(。
按照惯例,不应将属性用于需要很长时间的操作。
好吧,第一个和第二个最终都会生成类似于第三个的东西。但是,当您具有属性语法时,不要使用第三个语法。
最后,如果您在get
或set
中没有工作要做,请使用第一个。
最后,第一个和第二个只是某种形式的语法糖,但为什么要编写比必要的代码更多。
// more code == more bugs
只是为了找点乐子,请考虑一下:
public string A { get; private set; }
现在这更直接了,不是吗?public
修饰符隐含在get
和set
上,但它可以被覆盖。当然,对于定义属性本身时使用的任何修饰符,这将与规则相同。
有了这个,你可以在get
或set
范围内执行一些代码。
private string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
您还可以使用自动属性:
public string myProperty
{
get;
set;
}
.Net Framework将为您管理。之所以创建它,是因为它是一个很好的实践,并且很容易做到。
对于示例,您还可以控制这些范围的可见性:
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 => GetValue();
1st
string _myProperty { get; set; }
这在 .NET 世界中称为自动属性。这只是#2的语法糖。
第二
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
这是执行此操作的常用方法,如果您需要在属性中进行任何验证或额外代码,则需要这样做。例如,在 WPF 中,如果需要触发属性更改事件。如果你不这样做,只需使用 auto 属性,它几乎是标准的。
3
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public string setMyProperty(string value)
{
this._myProperty = value;
}
此处的this
关键字是多余的。根本不需要。这些只是获取和设置的方法,而不是属性,就像Java的做事方式一样。
澄清一下,在您的第三个示例中,_myProperty实际上不是一个属性。这是一个带有 get 和 set 方法的字段(如前所述,get 和 set 方法应指定返回类型(。
在 C# 中,在大多数情况下应避免使用第 3 种方法。只有当您要返回的类型是数组,或者 get 方法做了大量工作而不仅仅是返回值时,您才会真正使用它。后者并不是真正必要的,但为了清楚起见,属性的 get 方法做了很多工作是误导性的。
第一个是默认的,当没有什么特别的东西要返回或写入时。2nd 和 3rd 基本相同,其中 3rd 是 2nd
让我们从 3 开始。那行不通。 public getMyProperty()
没有返回典型值。
数字 1 和 2 实际上是相同的东西。2 是编译后的数字 1 变成的。
所以 1 和 2 是相同的东西。 使用两个,您可以在模型中进行一些验证或缓存。
除此之外,它们变得相同。
第一个是"简短"形式 - 当你不想对你的getter和setter做一些花哨的事情时,你可以使用它。不可能以这种形式执行方法或类似的东西。
第二种和第三种形式几乎相同,尽管第二种形式被压缩为一行。stylecop不鼓励这种形式,因为它看起来有些奇怪,不符合C'风格指南。
如果我希望将我的getter/setters用于特殊的事情,例如使用惰性结构等,我会使用第三种形式。