2012-12-28 39 views
5

我只是想知道在性能和最佳實踐方面推薦採用以下哪種方法。是否有任何性能差異?C#深入訪問對象性能

if (objA.objB.objC.objD.objE != null) 
{ 
    objX.var1 = objA.objB.objC.objD.objE.prop1; 
    objX.var2 = objA.objB.objC.objD.objE.prop2; 
    objX.var3 = objA.objB.objC.objD.objE.prop3 + objA.objB.objC.objD.objE.prop4; 

    ...... 
    ...... 
} 

or 

var objonlyE = objA.objB.objC.objD.objE 
if (objonlyE != null) 
{ 
    objX.var1 = objonlyE.prop1; 
    objX.var2 = objonlyE.prop2; 
    objX.var3 = objonlyE.prop3 + objonlyE.prop4; 
    ...... 
    ...... 
} 
+0

可能存在性能上的差異卻是不明顯的。 – mdcuesta

+0

這是一個不好的設計遺憾地說: – paritosh

+0

你知道編譯器會找到一個直接訪問屬性的權利? –

回答

0

二是隻是更容易使用。所以,更好,因爲你不重複,重複,再重複你的代碼...

0

我更喜歡第二種方法,它更可讀。在性能方面,它應該是不明顯的,即在常規變量/屬性的情況下。如果在屬性下隱藏了一些性能繁重的操作,那麼您也應該使用第二個版本,因爲它會更快。

3

性能沒有進入它,因爲屬性訪問將會很快(即使不是,如果您以相同的順序訪問相同的屬性,它也沒有什麼區別)。

可維護性和可讀性是問題,在這方面,您的第二種選擇要好得多。

閱讀有關Law of Demeter

迪米特法則(LOD)或原理的知識最少是開發軟件設計原則,特別是面向對象的程序。在一般形式中,LoD是一種鬆散耦合的特殊情況。

+0

是的,但是......爲什麼不回答被問到的問題:在C#/ .NET中,常見的子表達式並沒有被編譯器消除,所以總是用手去除它們導致加速,加速是否被檢測到是一個不同的問題 –

+0

@romkyns - 正確。 edup(?)在這裏不是問題。我寧願指出第一種方法確實存在的明顯的大問題。而且,你永遠不知道未來版本的編譯器是否無法消除子表達式... – Oded

+0

@Oded我懷疑未來的版本會這樣做,特別是如果它們是屬性而不是字段。 (就我個人而言,我不希望發生這種情況) –

6

第二個是更好的,因爲你永遠不知道隱藏在'。'後面的是什麼。它可能是數據庫調用或其他一些昂貴的操作。

0

在第二種方法你有程序員的失誤少的地方,例如在一個拳頭,你可以做以下的錯誤:

objX.var1 = objA.objB.objC.objD.objE.prop1; 
objX.var2 = objA.objB.**objU**.objD.objE.prop2;