在C#中,我对属性感到困惑。特别是当您将get设置为{ get; set;}
时。这样做意味着什么?例如,我有类属性:
public Dictionary<string, string> clientDict { get; set; }
我见过他们实际定义get和set的属性。我也明白删除set会使它只读。但是在这种情况下会发生什么?它只是使用普通字典的默认访问器吗?
答案 0 :(得分:3)
您可能会将类成员的访问者与集合的访问者混淆。正如评论者所指出的那样,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>
类[]
和{{1}无关}} 方法。
通过属性访问词典时:
.Add()
这将首先返回var foo = clientDict["SomeKey"];
*属性访问的结果,即对clientDict
的引用,然后将索引到该字典,返回结果值(假设密钥存在)和将其分配给_clientDict
。
如果您对自动属性感到困惑,请评论或编辑问题。
*顺便说一下,我把所有我都没有写foo
作为属性的名称,因为C#约定是像方法名一样大写属性名:)
答案 1 :(得分:3)
当你写一个像前一个属性时。
public Dictionary clientDict {get;组; }
编译器将其转换为以下
ClientDict
当你写下一个属性如下
private Dictionary<string, string> _clientDic;
public Dictionary<string, string> clientDic
{
get { return _clientDic; }
set { _clientDic = value; }
}
编译器将其转换为以下
public int X {get;}
答案 2 :(得分:2)
fill(0,x,[]).
fill(N,A,[A | As]) :-
N1 is N-1,
fill(N1,A,As).
相当于手动定义public Dictionary<string, string> clientDict { get; set; }
和get
。编译器在幕后为您处理所有这些。所以你的上述将成为:
set
答案 3 :(得分:1)
简化它。如果它是int
而不是Dictionary
会是什么意思?
public int ClientInt {get;set;}
int
没有访问者,所以你不会发现自己会问这个问题。
答案 4 :(得分:0)
在C#中,我对属性感到困惑。特别是当你设置get和 设为刚刚{get;组;}。 这样做意味着什么?
这意味着您正在定义Automatic Property
,在幕后,编译器会创建一个私有的匿名backing field
,只能通过属性的get和set访问器进行访问。
所以,你的下一个问题可能是......
什么是
backing field
?
backing field
是field
,property
引用存储和检索值。
您已经看到了automatic property
的样子,这是一个property
backing field
的样子......
private string name; // Backing field
public string Name // Property
{
get { return this.name; }
set { this.name = value }
}
我见过他们实际定义get和set的属性。我也 了解删除集使其成为只读。
是的,它使Property
成为只读,但要小心,因为C#
还包含一个名为keyword
的{{1}},readonly
设置在Fields
上。例如。 private readonly string name;
..
正如属性可以是read only
一样,它们也可以是write only
,如果您删除Get
访问者,只留下Set
访问者,则客户端只会能够写信给它。
但是在这种情况下会发生什么?它只是使用普通字典的默认访问器吗?
您上面给出的字典示例将有一个支持字段......客户端将能够写入并从中读取。
如果我们想要的话,我们可以改变...
想象一下,我们提供了一场真人橄榄球比赛的分数,让write
访问客户将是一场噩梦...所以我们可以限制它并且只展示一个get
访问者,同时保持set
访问者私密。
public int TeamFoo { get; private set; }
public int TeamBar { get; private set; }
或者,我们可以使用明确定义的支持字段来实现...
private int teamFoo;
public int TeamFoo { get { return teamFoo; } }