在C#中,我對屬性感到困惑。特別是當你設置get和設置爲{ get; set;}
。你這樣做意味着什麼?例如,我有類屬性:C#自動執行的屬性幫助
public Dictionary<string, string> clientDict { get; set; }
我已經看到了它們實際定義的get和set的屬性。我也明白,刪除設置使其只能讀取。但是在這種情況下會發生什麼?它只是使用正常字典的默認訪問器?
在C#中,我對屬性感到困惑。特別是當你設置get和設置爲{ get; set;}
。你這樣做意味着什麼?例如,我有類屬性:C#自動執行的屬性幫助
public Dictionary<string, string> clientDict { get; set; }
我已經看到了它們實際定義的get和set的屬性。我也明白,刪除設置使其只能讀取。但是在這種情況下會發生什麼?它只是使用正常字典的默認訪問器?
當你寫一個屬性像上一個。
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; }
}
簡化它。如果它是int
而不是Dictionary
,這意味着什麼?
public int ClientInt {get;set;}
有用於int
沒有存取,這樣你就不會發現自己在問這個問題。
是的,但我要求的是將它們設置爲get;組;而不是{在這裏實現}設置{implementation here}是什麼意思?它只是使用基礎Dictionary類的get/set方法 – shenk
問問自己:它對'int'有什麼作用 –
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; }
}
您可以將訪問者與訪問者被混淆到類成員到集合。作爲一個評論者指出的那樣,在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#的慣例是資本的屬性名稱就像方法的名字:)
在C#中,我對屬性感到困惑。特別是當你設置get和 設置爲只是{get;組;}。 當你這樣做時,這意味着什麼?
這意味着您定義Automatic Property
,並且在幕後,編譯器創建一個私有,匿名backing field
只能通過屬性的get和set訪問進行訪問。
所以,你的下一個問題可能是...
什麼是
backing field
?
甲backing field
是field
一個property
引用來存儲和從檢索值哪個。
你見過一個automatic property
看起來像什麼,這裏就是一個backing field
一個property
看起來像......
private string name; // Backing field
public string Name // Property
{
get { return this.name; }
set { this.name = value }
}
我見過他們實際上定義獲得屬性和設置。我也 明白,刪除設置使其只讀。
是它使Property
只讀的,但要小心,因爲C#
也包含上Fields
設置keyword
稱爲readonly
。例如。 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; } }
https://msdn.microsoft.com/en-us/library/bb384054.aspx – Claies
的CLR會在你看到的一個局部變量的後面創建,所以這與以下內容相同:'private Dictionary _clientDict; public Dictionary ClientDict { get { return _clientDict; } set { _clientDict = value; } } –
@BelahceneBenzaraTahar * CLR將創建後面看到* ...編譯器... –