2012-12-28 7 views
5

Ich möchte nur wissen, welche der folgenden Ansatz in Bezug auf die Leistung und Best Practices empfohlen wird. Gibt es einen Leistungsunterschied?C# tief zugreifende Objekte Leistung

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

es vielleicht Unterschied in der Leistung, aber es ist nicht wahrnehmbar. – mdcuesta

+0

es ist ein schlechtes Design Sorry zu sagen :( – paritosh

+0

Wissen Sie, dass der Compiler einen direkten Zugriffspfad auf die Eigenschaften finden wird? –

Antwort

0

Die zweite ist nur einfacher zu bedienen ... Also, besser, weil man nicht wiederholen Sie den Code wieder und wieder und wieder ...

0

I zweiter Ansatz bevorzugen, ist es viel mehr lesbar. In Bezug auf die Leistung sollte es nicht bemerkbar sein, das heißt im Falle von regulären Variablen/Eigenschaften. Wenn einige leistungslastige Operationen unter den Eigenschaften verborgen sind, sollten Sie auch die zweite Version verwenden, da diese schneller ist.

3

Die Leistung wird nicht erreicht, da der Zugriff auf Eigenschaften schnell erfolgt (und selbst wenn dies nicht der Fall ist, macht es keinen großen Unterschied, wenn Sie in derselben Reihenfolge auf dieselben Eigenschaften zugreifen).

Wartbarkeit und Lesbarkeit sind die Probleme und in dieser Hinsicht ist Ihre zweite Option viel besser.

Lesen Sie mehr über die Law of Demeter:

Das Gesetz der Demeter (LoD) oder Prinzip des kleinsten Wissen ein Designrichtlinien ist eine Software für die Entwicklung, insbesondere objektorientierte Programme. In seiner allgemeinen Form ist der LoD ein spezifischer Fall von loser Kopplung.

+0

Ja, aber ... Warum beantworten Sie nicht auch die gestellte Frage: In C# /. NET werden gemeinsame Teilausdrücke nicht vom Compiler eliminiert, also immer von Hand eliminiert führt zu einer Beschleunigung.Ob die Beschleunigung ist nachweisbar ist eine andere Frage –

+0

@romkyns - Genau edup (?) ist hier nicht das Thema. Ich möchte eher auf die eklatanten großen Probleme hinweisen, die mit dem ersten Ansatz existieren. Und Sie wissen nie, ob eine zukünftige Version des Compilers nicht in der Lage sein wird, Teilausdrücke zu eliminieren ... – Oded

+0

@Oded Ich bezweifle, dass eine zukünftige Version das tun wird, besonders wenn sie Eigenschaften und keine Felder sind. (Persönlich würde ich _not_ das geschehen lassen) –

6

Die zweite ist besser, weil man nie weiß, was sich hinter einem '.' Versteckt. Es könnte ein Datenbankanruf oder eine andere teure Operation sein.

0

Im zweiten Ansatz ein Sie haben weniger Platz für Programmierer Fehler beispielsweise in der Faust, die Sie den folgenden Fehler machen könnte:

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