2015-05-25 132 views
10

我在VSTO插件中使用.NET 4.5 for Outlook 2013.我在完全掌握屬性和訪問器時遇到了一些麻煩。自動實現的訪問器,我假設你只是寫get;組;而不是{// code}等等也給我帶來麻煩。我有一本我在課堂上內部使用的字典。這裏是我的代碼:屬性和自動實現

private Dictionary<string, string> clientDict { get; set; } 
private Dictionary<string, string> clientHistoryDict { get; set; } 

再後來:

clientDict = new Dictionary<string, string>(); 
clientHistoryDict = new Dictionary<string, string>(); 

我使用相同的名稱稍後在代碼中的性能,在同一個類中。

我從來沒有真正寫:

private Dictionary<string, string> _clientDict; // etc. 

創建我只是直接使用屬性的變量。

我試着改變我的代碼來做到這一點,我有一些問題,並認識到我對屬性的理解有點混亂。

這裏有幾個問題我需要澄清,我似乎無法找到正確的答案。

首先,是否有任何理由使用私有財產?我的字典永遠不會在類之外或任何派生類中訪問,因此甚至有理由甚至使用屬性?我沒有使用任何特殊的驗證或任何在setter或類似的東西。其次,當我試圖將我的代碼更改爲使用變量,然後通過屬性(如典型屬性示例)訪問它們時,我遇到了問題。我發現一個例子,其中吸氣劑被設置爲return _clientDict,但二傳手只是它給了我一個錯誤:我必須給一個身體,因爲它不是抽象的或部分的。爲什麼在這種情況下它不會自動爲我執行setter?

最後,當我對與它聲明的同一類中的屬性調用new時,與屬性和相同類型的普通變量做什麼區別?在這種情況下,屬性是否與變量完全不同?當使用私有變量來完成屬性時,使用屬性是不好的做法嗎?

這些可能是一些錯誤的問題,但我找不到任何其他地方有信息來幫助我理解這些區別。我一直在玩弄各種屬性來試圖解決所有這些問題,但我可以使用我的幫助。

回答

11

First, is there any reason to use a private property?

通常,沒有。性能非常適合封裝。使用屬性的一個好處(有manymore)是它可以在賦值之前進行驗證。當你有東西private時,你通常不需要需要來自己保護東西。另外,屬性具有設置不同訪問器(privateprotected等)的優點,其中字段不包含。

Why would it not auto-implement the setter for me in this instance?

我們必須明白,自動實現的屬性並非黑魔法。編譯器將爲我們生成一個私有的後臺字段,而不是提供一個我們自己的。從他的角度來看,他認爲你有一個返回私人領域的getter,但setter是自動的,通常會在你的代碼中指示某種邏輯錯誤。爲什麼你會返回一個值,但設置一個完全不同的值?當您創建具有後臺字段的屬性時,您必須同時提供獲取者和設置者,those are the rules

when I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type?

語義,沒有new屬於正在構建的類型,並將發出構造函數調用。區別在於新創建的對象是,分配爲。一個字段將導致編譯器發出一個stfld操作碼。對於一個屬性,它會發出一個call來調用屬性設置器。當你訪問屬性時,編譯器將最終在現場調用get_YourPropertyName而不是ldfld

Is it bad practice to use properties this way when it should be accomplished with private variables?

我不會稱之爲不好的做法,但我會覺得有一點私人財產有點奇怪。

有關字段和屬性的更多見解,請參閱What is the difference between a Field and a Property in C#?

+0

巨大的幫助非常感謝,只是一些澄清?你的意思是什麼字段不能有訪問說明符?私人成員變量不是一個例子嗎?我想我錯過了你的意思。 – shenk

+2

私人財產的爭論是未來可能發生的變化。雖然你現在沒有驗證邏輯,但你將來可能已經擁有一個屬性給你一個地方來改變這個邏輯,而不是你的類中每一個地方都有一個分配,這使得你的類不變更容易維護。這可能不是一個很好的論據,特別是在所有情況下,它都可以幫助封裝某些類型的波動。 –

+0

@shenk屬性可以這樣做:'public string Foo {get;保護組; }',這意味着只有派生類型可以設置'Foo'的值。一個領域不能做到這一點。 –

3

Is there any reason to use a private property?

沒有 - 這是自動實現的關鍵所在。當你想要做的就是獲取或設置私有成員變量中的內容時,它可以節省你不得不編寫所有額外的代碼。 .Net處理幕後私有成員變量的創建。

When I tried to change my code to use variables and then access them via the properties like your typical property example would, I ran into problems. I found an example where the getter was set to return _clientDict, but the setter was just set; It gave me the error: that I must give set a body because it's not abstract or partial. Why would it not auto-implement the setter for me in this instance?

我的理解是自動執行完全沒有。 (儘管如此,打開糾正)。這就是說,我看到代碼編譯的集合塊簡單地定義爲set { }編輯:只是爲了澄清set { }塊不會實際設置的值,它實質上吞下了呼叫,什麼都不做 - 它會編譯。

When I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type? Do properties differ at all from variables in that case? Is it bad practice to use properties this way when it should be accomplished with private variables?

據我所知,沒有真正的區別。同樣的事情正在發生,只是.net正在爲你處理管道。

相關問題