2008-11-17 42 views
2

我有一個有一些屬性的類。我希望能夠從這些屬性中計算得分。由於這是一項微不足道的任務(有些增加和劃分,但沒有什麼特別的)。將屬性更改爲方法 - 任何副作用?

所以很自然地,問題是:「什麼時候在getter中使用帶有代碼的屬性,何時使用函數?」和that question was already answered。現在,我想知道一件事情:如果 - 反對所有的期望 - 我需要使這個Getter變得如此複雜,以至於它應該是一個函數(例如,因爲我需要將數據放入或因爲它可能拋出一個例外或其他),是否容易將屬性更改爲方法?

當然,它似乎真的微不足道,只是改變

public double Score { 
    get { 
     return Math.Round(A + B/C * D,3); 
    } 
} 

public double Score(){ 
    return Math.Round(A + B/C * D,3); 
} 

但我不知道:有沒有什麼副作用?在改變這樣的東西時是否會有什麼破壞?當涉及到Reflection時,我只能把它看作是一個可能的問題,但是在我有兩個程序集的情況下 - 一個定義類和一個使用類 - 並且只更改包含該類的程序集而不重新編譯消費者部件。這是否是「幾乎不可能跟蹤的奇怪錯誤」的可能來源,還是將屬性更改爲方法是完全安全的?

回答

1

號有沒有副作用影響到這個在所有。

拉起反射器,你會看到你的 性能已經是方法

引擎蓋下的getset存取的屬性被簡單地轉換爲get_MyPropertyName()set_MyPropertyName()方法。這也是爲什麼你可以(但通常不應該)向參數添加參數的原因。

唯一的「難題」是在C#中,您需要將「()」添加到任何現有的調用中。

另外

根據編碼準則,一個 屬性名稱通常是名詞(即 得分),但方法應該描述 動作(動詞),所以更恰當的名字是 GetScore()或CalculateScore()

+0

謝謝。我只是怕有更多隱藏的黑魔法。接受這個答案,因爲它更精細,但upvoted兩個。 – 2008-11-17 20:30:10

3

拉起反射器,你會看到你的屬性已經是方法:)

+0

是的,封面下的東西完全一樣 – 2008-11-17 20:25:54

1

如果你打算從屬性更改爲方法,並讓編譯器告訴你在哪裏添加parethesis,你可以得到微妙的錯誤爲object ting = thing.scoreting將是一個盒裝的一倍得分的財產版本,但對於分數的方法版本的委託,因此不同的代碼路徑會導致其中:

public void erm(double param){ //stuff here} 
public void erm(func<double> param) {// different stuff here} 

時你打電話

erm(thing.score) 

與屬性與方法版本的分數。

1

一方的影響是打破了這個屬性的所有調用代碼。您將更新所有呼叫者給我們的方法簽名,而不是財產

0

正如其他人已經指出 - 沒有什麼可擔心的。我只是張貼澄清說,根據編碼指南,屬性名稱通常是名詞(即分數),但方法應描述動作(動詞),所以更正確的名稱是GetScore()或CalculateScore():)

語法納粹在行動:)

相關問題