2015-05-09 39 views
2

在C#中,我對屬性感到困惑。特別是當你設置get和設置爲{ get; set;}。你這樣做意味着什麼?例如,我有類屬性:C#自動執行的屬性幫助

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

我已經看到了它們實際定義的get和set的屬性。我也明白,刪除設置使其只能讀取。但是在這種情況下會發生什麼?它只是使用正常字典的默認訪問器?

+0

https://msdn.microsoft.com/en-us/library/bb384054.aspx – Claies

+0

的CLR會在你看到的一個局部變量的後面創建,所以這與以下內容相同:'private Dictionary _clientDict; public Dictionary ClientDict { get { return _clientDict; } set { _clientDict = value; } } –

+1

@BelahceneBenzaraTahar * CLR將創建後面看到* ...編譯器... –

回答

3
  1. 這被稱爲「自動屬性」。 (當你只寫集合和沒有任何代碼的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; } 
} 
1

簡化它。如果它是int而不是Dictionary,這意味着什麼?

public int ClientInt {get;set;} 

有用於int沒有存取,這樣你就不會發現自己在問這個問題。

+0

是的,但我要求的是將它們設置爲get;組;而不是{在這裏實現}設置{implementation here}是什麼意思?它只是使用基礎Dictionary類的get/set方法 – shenk

+0

問問自己:它對'int'有什麼作用 –

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

相當於手動定義getset。編譯器在後臺爲你處理所有這些。所以,你的上面將成爲:

private Dictionary<string, string> _clientDict; 
public Dictionary<string, string> clientDict; 
{ 
    get { return _clientDict; } 
    set { _clientDict = value; } 
} 
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>類的[].Add()方法無關。

當您通過屬性訪問字典:

var foo = clientDict["SomeKey"]; 

這將首先返回的clientDict *屬性的訪問,即以_clientDict參考的結果,然後將索引該字典,返回結果值(假設密鑰存在)並將其分配給foo

如果更進一步讓您對自動屬性感到困惑,請評論或編輯問題。

*順便說一句,它採取一切我已經有了不寫ClientDict爲屬性的名稱,因爲C#的慣例是資本的屬性名稱就像方法的名字:)

0

在C#中,我對屬性感到困惑。特別是當你設置get和 設置爲只是{get;組;}。 當你這樣做時,這意味着什麼?

這意味着您定義Automatic Property,並且在幕後,編譯器創建一個私有,匿名backing field只能通過屬性的get和set訪問進行訪問。


所以,你的下一個問題可能是...

什麼是backing field

backing fieldfield一個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; } }