2012-12-28 42 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;