2012-03-05 52 views
0

我想知道,如果這一點:列表<T>財產與私人組

private List<FixedTickProvider> minorTickProviders; 
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } } 

是相同的:

public List<FixedTickProvider> MinorTickProviders { get; private set; } 

的事情是:我繼承了第一段代碼,而我自己更習慣第二種選擇。由於即將重寫代碼部分,我想知道這兩個是否完全相同。

請注意,我不是在說這裏只讀列表。我完全知道here討論的「只讀列表」主題,而我的問題稍有不同。

注:我幾乎肯定我曾經閱讀過一篇文章,指出編譯器會從這兩個摘錄中產生完全相同的代碼,但我無法再找到它,也無法找到關於此主題的精確答案。所以請賜教。

+0

的代碼是相同的功能,因爲你很清楚。你在問性能差異嗎? – Steve 2012-03-05 09:21:56

+0

我並沒有特別詢問任何事情,並想知道有什麼區別,無論是表現方式還是其他方面。這更像是「我想更多地瞭解這個主題」的東西。每個說法都不是真正的「問題」。所以關於這個問題的任何事情都是值得歡迎的 – David 2012-03-05 09:34:43

回答

2

是的,代碼兩片將實現相同的結果

//here you are declaring a private field of class 
private List<FixedTickProvider> minorTickProviders; 
//and only exposing get to rest of the code 
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } } 

//here you are declaring a public property which can only be set by the class which is declaring it 
public List<FixedTickProvider> MinorTickProviders { get; private set; } 

至於IL被認爲會略有差異

在單獨的字段和屬性以下IL的情況下,將產生 enter image description here

在單一屬性的情況下而不備份字段

enter image description here

+0

愚蠢的問題:只要可以肯定,IL =內部邏輯,對嗎? (從來沒有見過IL縮寫詞) – David 2012-03-05 09:39:12

+0

不,這意味着中級語言。每個.Net代碼都被編譯並轉換爲IL。它不是直接轉換並存儲爲機器碼。在運行時,這個IL被轉換成機器代碼並執行 – 2012-03-05 09:42:20

+0

@David IL =中級語言http://en.wikipedia.org/wiki/Common_Intermediate_Language。 – AlanT 2012-03-05 09:43:34

3

在C#3.0及更高版本中,當屬性訪問器中不需要額外的邏輯時,自動實現的屬性使得屬性聲明更加簡潔。它們還使客戶端代碼能夠創建對象。當你聲明一個屬性時,編譯器會創建一個私有的匿名支持字段,只能通過屬性的get和set訪問器來訪問。 因此,兩者將具有相同的輸出......

0

他們實現了等效的結果,除了任何分配值的代碼在兩者之間將不同(第一個將分配給字段,第二個分配給第財產)等等,當然,生成的IL也會略有不同。


(當然,在財產分配的情況下,它很可能是方法調用和最終字段賦值是直列很簡單)