[英]C# Auto-Implemented Properties Assistance
在C#中,我对属性感到困惑。 特别是当你设置get并设置为just { get; set;}
{ get; set;}
。 这样做意味着什么? 例如,我有class属性:
public Dictionary<string, string> clientDict { get; set; }
我已经看到了他们实际定义get和set的属性。 我也明白删除set会使它只读。 但是在这种情况下会发生什么? 它只是使用普通字典的默认访问器吗?
您可能会将访问者与具有集合访问者的类成员混淆。 正如评论者所指出的, Auto-Implemented Properties上的MSDN页面解释了这一点:
public Dictionary<string, string> clientDict { get; set; }
相当于:
private Dictionary<string, string> _clientDict;
public Dictionary<string, string> clientDict
{
get { return _clientDict; }
set(Dictionary<string, string> value)
{
_clientDict = value;
}
}
这些访问器只返回对集合的引用。 它们没有传递任何东西(正如你的问题所暗示的那样“它只是使用普通字典的默认访问器吗?”),它们与Dictionary<T>
类的[]
和.Add()
方法无关。
当您通过属性访问词典时:
var foo = clientDict["SomeKey"];
这将首先返回clientDict
*属性访问的结果,即对_clientDict
的引用,然后将索引到该字典中,返回结果值(假设密钥存在)并将其分配给foo
。
如果进一步让您对自动属性感到困惑,请评论或编辑问题。
*顺便说一下,它正在把我所有的东西都没有写入ClientDict
作为属性的名称,因为C#约定是像方法名一样大写属性名称:)
当你写一个像前一个属性。
public Dictionary clientDict {get; 组; }
编译器将其转换为以下内容
private Dictionary<string, string> _clientDic;
public Dictionary<string, string> clientDic
{
get { return _clientDic; }
set { _clientDic = value; }
}
当你写一个像下面这样的属性
public int X {get;}
编译器将其转换为以下内容
private int _x;
public int X{
get { return _x; }
}
public Dictionary<string, string> clientDict { get; set; }
相当于手动定义get
和set
。 编译器在幕后为您处理所有这些。 所以你的上面会成为:
private Dictionary<string, string> _clientDict;
public Dictionary<string, string> clientDict;
{
get { return _clientDict; }
set { _clientDict = value; }
}
简化它。 如果它是int
而不是Dictionary
这意味着什么?
public int ClientInt {get;set;}
int
没有访问器,所以你不会发现自己在问这个问题。
在C#中,我对属性感到困惑。 特别是当你设置get并设置为just {get; 组;}。 这样做意味着什么?
这意味着您正在定义Automatic Property
,并且在幕后,编译器会创建一个私有的匿名backing field
,只能通过属性的get和set访问器进行访问。
所以,你的下一个问题可能是......
什么是
backing field
?
backing field
是property
引用以存储和检索值的field
。
你已经看到了automatic property
样子,这里有一个带有backing field
的property
看起来像......
private string name; // Backing field
public string Name // Property
{
get { return this.name; }
set { this.name = value }
}
我已经看到了他们实际定义get和set的属性。 我也明白删除set会使它只读。
是的,它使该Property
只读,但要小心,因为C#
还包含一个名为readonly
的keyword
,它在Fields
上设置。 例如private readonly string name;
..
就像属性可以read only
,它们也可以write only
,如果你删除了Get
访问器,只留下了Set
访问器,客户端只能写入它。
但是在这种情况下会发生什么? 它只是使用普通字典的默认访问器吗?
您上面给出的字典示例将有一个支持字段...客户端将能够写入并从中读取。
如果我们想要的话,我们可以改变...
想象一下,我们提供了一个现场足球比赛的分数,给客户write
访问权限将是一场噩梦...所以我们可以限制它,只暴露一个get
访问器,同时保持set
accessor私有。
public int TeamFoo { get; private set; }
public int TeamBar { get; private set; }
或者,我们可以使用明确定义的支持字段来完成...
private int teamFoo;
public int TeamFoo { get { return teamFoo; } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.