繁体   English   中英

C#自动实现的属性帮助

[英]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#约定是像方法名一样大写属性名称:)

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

    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; }

相当于手动定义getset 编译器在幕后为您处理所有这些。 所以你的上面会成为:

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 fieldproperty引用以存储和检索值的field

你已经看到了automatic property样子,这里有一个带有backing fieldproperty看起来像......

private string name; // Backing field

public string Name   // Property 
{
    get { return this.name; }
    set { this.name = value }
}

我已经看到了他们实际定义get和set的属性。 我也明白删除set会使它只读。

是的,它使该Property只读,但要小心,因为C#还包含一个名为readonlykeyword ,它在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM