2012-10-31 68 views
1

從我可以告訴,屬性用於提供accessor方法esque功能;然而,它們是以正常的方法繼承行爲爲代價的。使用屬性與傳統的setter/getter方法相比有什麼優勢?屬性和訪問器方法的優缺點是什麼?C# - 屬性與訪問器方法?

+6

您的第一個示例編譯並運行得很好。 – dtb

+0

您仍繼承這些成員,只是在派生類中指定要查詢「Datum」屬性時,您需要指定要訪問Datum的基類實現('base.Datum = 2 ') - 雖然我確定它應該可以工作,無論(當你重載Datum並且仍然想要查詢基本實現時你肯定需要使用超類訪問器) – Charleh

+0

嗯,出於某種原因,在一個項目下,我得到錯誤,但把它放在一個新的項目中運行良好。我的錯。 – weberc2

回答

1

我想你可能會感到困惑。在你的例子中,上述方法應該可以訪問。例如,給定這組類型,下面應該工作:

public class Base 
{ 
    public virtual int Datum { get; set; } 
} 

public class Derived : Base 
{ 
    public override int Datum 
    { 
     get { return 12; } 
     // set method remains as normal, with just the get overriden 
    } 

    public void SetDatumMethod(int newValue) 
    { 
     Datum = newValue; // Datum as a property is still accessible 
    } 
} 

派生類依然繼承財產。屬性實際上只是C#中的語法糖(主要是),因爲編譯器在後臺爲您生成set_Datum(int x)get_Datum()方法。如上所示,屬性get/set方法仍然可以單獨覆蓋。

使用屬性的優點是它們具有額外的語義含義;它們以某種方式「包含」或「代表」數據,而不是用於生成數據的方法。

+0

Gotcha。請注意,您對我的示例是正確的,因爲它無效,所以我將其刪除。另外,關於「隱藏」屬性(我不完全理解它,但我不認爲你可以像你可以隱藏一個訪問器方法屬性)?我記得在嘗試將屬性作爲訪問方法時遇到了其他困難,但我記不起任何手。到目前爲止,您的回答很有幫助,但如果更多信息存在,我將不勝感激。 – weberc2

+0

謝謝,我只是想驗證你的答案是兩者的徹底比較,而不是泛化。 – weberc2

0

Visual Studio調試器在觀察對象時執行getter方法。也就是說,屬性訪問器在不可預知的時間執行,因此不應引起任何可辨別的副作用。濫用屬性會導致難以解決的問題。

使用方法的另一個原因是訂單檢索可能被參數化。

一個很好的做法是,財產訪問計算便宜;不應強制客戶端代碼將屬性值放入局部變量中 - 這是過早的優化。

+0

你是指「濫用財產」?你能更具體地瞭解什麼構成濫用和潛在的結果錯誤?此外,什麼是「訂單檢索」,你能更具體地說明爲什麼「參數化訂單檢索」比任何「訂單檢索」特性使用的更好?最後,我不明白當你建議以「計算便宜」的方式進行財產訪問時你的意思。在什麼情況下,客戶端代碼會被強制將屬性值放入局部變量中?你能提供這些場景的例子嗎? – weberc2