Wiz*_*Liz 133 .net c# visual-studio-2010
我想知道那些getter和setter声明之间的区别是什么,以及是否有一个首选方法(以及为什么).第一个可以由Visual Studio自动生成.其他人怎么样?谢谢
1
string _myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
第2
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
第3
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public void setMyProperty(string value)
{
this._myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)
Wou*_*ort 190
属性用于封装一些数据.您可以使用普通字段:
public string MyField
Run Code Online (Sandbox Code Playgroud)
但是,您的班级的所有外部用户都可以访问此字段.人们可以插入非法值或以您不期望的方式更改值.
通过使用属性,您可以封装数据的访问方式.C#有一个很好的语法,可以将字段转换为属性:
string MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
这称为自动实现的属性.如有需要,您可以将您的物业扩展至:
string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以添加验证以下值的代码setter
:
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException();
_myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)
属性也可以为getter和setter提供不同的访问器:
public string MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)
这样,您可以创建一个可供所有人阅读的属性,但只能由类本身进行修改.
您还可以为您的添加完全自定义的实现getter
:
public string MyProperty
{
get
{
return DateTime.Now.Second.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
当C#编译您的自动实现属性时,它会生成中间语言(IL).在您的IL中,您将看到一个get_MyProperty
和set_MyProperty
方法.它还会创建一个名为的后备字段<MyProperty>k_BackingField
(通常这在C#中是非法的名称,但在IL中它是有效的.这样您就不会在生成的类型和您自己的代码之间产生任何冲突).但是,您应该使用C#中的官方属性语法.这在C#中创造了更好的体验(例如使用IntelliSense).
按照惯例,您不应该将属性用于需要很长时间的操作.
Mik*_*oud 12
好吧,第一个和第二个都产生类似于最后的第三个.但是,如果您具有属性的语法,请不要使用第三个.
最后,如果您没有工作要做,get
或者set
使用第一个.
最后,第一个和第二个只是某种形式的语法糖,但为什么编码超过了必要的.
// more code == more bugs
Run Code Online (Sandbox Code Playgroud)
只是为了享受一点乐趣,请考虑一下:
public string A { get; private set; }
Run Code Online (Sandbox Code Playgroud)
现在这更直接了不是吗?该public
修饰符意味着在这两个get
和set
,但它可以被覆盖.对于定义属性本身时使用的任何修饰符,这当然是相同的规则.
1
string _myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
这在.NET世界中称为自动属性.这只是#2的语法糖.
第2
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
这是通常的方法,如果您需要在您的财产中进行任何验证或额外的代码,这是必需的.例如,在WPF中,如果您需要触发Property Changed Event.如果你不这样做,只需使用auto属性,它几乎是标准的.
3
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public string setMyProperty(string value)
{
this._myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)
this
这里的关键字是多余的.根本不需要.这些只是获取和设置而不是属性的方法,比如Java的做事方式.
这样,您可以在get
或set
范围内执行一些代码。
private string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用自动属性:
public string myProperty
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
.Net Framework将为您管理。之所以创建它,是因为它是一个很好的实践,并且易于实现。
您还可以控制这些范围的可见性,例如:
public string myProperty
{
get;
private set;
}
public string myProperty2
{
get;
protected set;
}
public string myProperty3
{
get;
}
Run Code Online (Sandbox Code Playgroud)
现在,在C#中,您可以初始化属性的值。样品:
public int Property { get; set; } = 1;
Run Code Online (Sandbox Code Playgroud)
如果也可以定义它并使它只读,而无需设置。
public int Property { get; } = 1;
Run Code Online (Sandbox Code Playgroud)
最后,您可以定义箭头功能。
public int Property { get; } => GetValue();
Run Code Online (Sandbox Code Playgroud)