C#自动实现的属性帮助

时间:2015-05-09 20:48:24

标签: c# properties

在C#中,我对属性感到困惑。特别是当您将get设置为{ get; set;}时。这样做意味着什么?例如,我有类属性:

public Dictionary<string, string> clientDict { get; set; }

我见过他们实际定义get和set的属性。我也明白删除set会使它只读。但是在这种情况下会发生什么?它只是使用普通字典的默认访问器吗?

5 个答案:

答案 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)

  1. 这称为“自动属性”。 (当你只是编写set和get方法时,里面没有任何代码)
  2. 自动属性的目标是简化编码过程,并使其更快。
  3. 当你写一个像前一个属性时。

    public Dictionary clientDict {get;组; }

  4. 编译器将其转换为以下

    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 fieldfieldproperty引用存储和检索值。

您已经看到了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; } }