2011-04-13 30 views
2

我想知道調用short方法的開銷是多少,或者代碼是否會得到優化,並且與getter的成本不同?C#中的小方法調用和優化的代價

我只是舉一個例子,因爲它很難解釋。

我有一個網站的ClaimsManager獲取特定的聲明並返回它們。從另一個角度獲取一個聲明的過程只有一個ClaimsType字符串。

public string GetClaimValueByType(string ClaimType) 
{ 
    return (from claim in _claimsIdentity.Claims 
       where claim.ClaimType == ClaimType 
       select claim.Value).SingleOrDefault(); 
} 

/*Again would this be better or worse if I wanted to be able to choose if 
I want the claim versus the value? 

public Claim GetClaimByType(string ClaimType) 
{ 
    return (from claim in _claimsIdentity.Claims 
       where claim.ClaimType == ClaimType 
       select claim).SingleOrDefault(); 
} 

public string GetClaimValueByType(string ClaimType) 
{ 
    return GetClaimByType(ClaimType).Value; 
} 
*/  
public string GetEmail() 
{ 
    return GetClaimValueByType(ClaimTypes.Email); 
} 

/* Or should I use getters?... 
public string Email 
{ 
    get 
    { 
     return return GetClaimValueByType(ClaimTypes.Email); 
    } 
} 
*/ 

那麼,這是不好的做法有這些簡短的get方法?是否應該有一個很大的通話開銷,因爲它很短或者會被優化?最後,它使實際使用這裏干將更有意義?..

感謝

+0

我應該注意,如果聲明不存在,您應該忽略Claim.Value的nullException的全部潛力。 (請參閱第一個註釋區域)這不是問題的真正組成部分,所以不要費心去關注這個問題。 – kachingy123 2011-04-13 11:01:46

回答

5

在我看來,永遠邊際開銷有可能是使用getter和setter方法什麼是乾淨的,更容易維護的代碼抵銷對於任何.NET開發人員來說,最有可能更容易接受和運行。

但我想這也取決於你的索賠對象有多大。 :)

+4

問好的問題。我認爲很多入門和初級階段的人可能會傾向於過分分析情況。 – Kon 2011-04-13 10:49:14

2

表現明智之間,吸氣劑和方法之間沒有區別。吸氣器只是語法糖,並在編譯過程中轉換爲方法。關於何時使用getter以及何時使用方法,有一些通用指南。 This msdn page建議使用方法而不是屬性:

  • 該操作是一種轉換,如Object.ToString。
  • 該操作非常昂貴,您希望與用戶溝通他們應該考慮緩存結果。
  • 使用get訪問器獲取屬性值會產生可觀察的副作用。
  • 連續兩次調用成員會產生不同的結果。
  • 執行順序很重要。請注意,應該可以按任意順序設置和檢索類型的屬性。
  • 該成員是靜態的,但返回一個可以更改的值。
  • 該成員返回一個數組。返回數組的屬性可能非常具有誤導性。通常有必要返回內部數組的副本,以便用戶不能更改內部狀態。這加上用戶可以輕易認定它是索引屬性的事實導致代碼效率低下。
+1

是的,但在kachingy的情況下,該方法返回一個簡單的字符串,而不是整個對象。 – Kon 2011-04-13 10:51:29

+0

感謝您的編輯。爲帖子添加了不錯的內容。 – kachingy123 2011-04-18 09:19:13

-2

我不會爲此使用吸氣劑,屬性是爲了返回常數的值。這意味着該順序調用應返回相同的值。這只是一個概念性的東西。

+2

你從哪裏得到這個想法?我當然不會在http://msdn.microsoft.com/en-us/library/w86s7x04%28v=VS.100%29.aspx中的任何地方看到它。一個常量返回一個常量,而一個屬性是一種獲取和/或在課堂上設置一個值。因爲你設計的許多類都是可變的,所以對於一個屬性是可變的,它是完全可以接受的。屬性主要提供了一個很好的句法糖,圍繞着諸如Java – RobV 2011-04-13 10:57:07

+0

等語言中流行的GetX()和SetX()風格的方法。我會問@ba__friend,你的意思是別的什麼,因爲我必須同意@RobV ... – kachingy123 2011-04-13 11:03:39

+0

我已經從「框架設計指南」中拿出來了,但我可能誤解了它,或者只是不好地表達了它。稍後我會看看它。 – 2011-04-13 11:29:57