我想知道那些getter和setter声明之间的区别是什么,以及是否有一个首选方法(以及为什么)。第一个可以由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;
}
答案 0 :(得分:178)
属性用于封装一些数据。你可以使用普通字段:
public string MyField
但是您的班级的所有外部用户都可以访问此字段。人们可以插入非法值或以您不期望的方式更改值。
通过使用属性,您可以封装数据的访问方式。 C#有一个很好的语法,可以将字段转换为属性:
string MyProperty { get; set; }
这称为auto-implemented property。当需要时,您可以将您的财产扩展到:
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)。
按照惯例,您不应该将属性用于需要很长时间的操作。
答案 1 :(得分:12)
嗯,第一个和第二个都生成之类的东西到最后的第三个。但是,如果您拥有属性的语法,请不要使用第三个。
最后,如果您在get
或set
中无需做任何工作,请使用第一个。
最后,第一个和第二个只是某种形式的语法糖,但为什么编码超过了必要的。
// more code == more bugs
为了获得一点乐趣,请考虑一下:
public string A { get; private set; }
现在更直接的是不是吗? public
和get
上的set
修饰符隐含,但可以覆盖它。对于定义属性本身时使用的任何修饰符,这当然都是相同的规则。
答案 2 :(得分:9)
第一
string _myProperty { get; set; }
这在.NET世界中称为Auto Property。这只是#2的语法糖。
第二
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
这是通常的方法,如果您需要在您的财产中进行任何验证或额外代码,则需要这样做。例如,在WPF中,如果您需要触发Property Changed Event。如果你不这样做,只需使用auto属性,这几乎是标准的。
3
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public string setMyProperty(string value)
{
this._myProperty = value;
}
此处的this
关键字是多余的。根本不需要。这些只是获取和设置而不是属性的方法,比如Java的做事方式。
答案 3 :(得分:4)
有了这个,您可以在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 { get; } => GetValue();
答案 4 :(得分:2)
为了澄清,在你的第三个例子中,_myProperty实际上并不是一个属性。它是一个带有get和set方法的字段(正如已经提到的,get和set方法应该指定返回类型)。
在C#中,大多数情况下应避免使用第三种方法。如果您想要返回的类型是数组,或者get方法执行了大量工作而不是仅返回值,那么您才真正使用它。后者并不是真正必要的,但为了清楚起见,属性的get方法做了很多工作会产生误导。
答案 5 :(得分:1)
让我们从3开始。那不行。 public getMyProperty()
没有返回打字。
数字1和2实际上是相同的东西。 2是编译后的数字1。
所以1和2是相同的东西。如果有两个,您可以在模型中进行一些验证或缓存。
除此之外,它们变得相同。答案 6 :(得分:0)
第一个是默认值,当没有什么特别的东西可以返回或写入时。 第二个和第三个基本相同,其中第三个是第二个
的更多扩展版本答案 7 :(得分:0)
第一个是“短”形式 - 当你不想对你的吸气剂和制定者做一些奇特的事情时,你会使用它。在这种形式下不可能执行某种方法或类似的方法。
第二种和第三种形式几乎完全相同,尽管第二种形式被压缩成一行。这种形式不受stylecop的影响,因为它看起来有些奇怪,并且不符合C'样式指针。
如果我希望将我的getter / setter用于特殊的东西,我会使用第三种形式,例如使用懒惰的构造左右。