Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#深度访问对象性能_C#_Performance_Oop - Fatal编程技术网

C#深度访问对象性能

C#深度访问对象性能,c#,performance,oop,C#,Performance,Oop,我只是想知道,就性能和最佳实践而言,建议采用以下哪种方法。性能有什么不同吗 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

我只是想知道,就性能和最佳实践而言,建议采用以下哪种方法。性能有什么不同吗

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;
   ......
   ......
}

第二个更容易使用。。。所以,更好的方法是,不要一次又一次地重复代码…

我更喜欢第二种方法,它更具可读性。就性能而言,它应该是不可察觉的,即在正则变量/属性的情况下。如果在属性下隐藏了一些高性能的操作,那么您也应该使用第二个版本,因为它会更快。

性能不在其中,因为属性访问会很快(即使不是,如果您以相同的顺序访问相同的属性,也没有什么区别)

可维护性和可读性是问题所在,在这方面,您的第二个选择要好得多

阅读以下内容:

Demeter定律(LoD)或最少知识原则是开发软件,特别是面向对象程序的设计准则。在其一般形式中,LoD是松耦合的一种特殊情况


第二个更好,因为你永远不知道“.”背后隐藏着什么。这可能是一个数据库调用或其他一些昂贵的操作。

在第二种方法中,程序员错误的发生率较低,例如在第一种方法中,您可能会犯以下错误:

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

可能存在性能差异,但这是不明显的。很抱歉,这是一个糟糕的设计:(您知道编译器会找到指向属性的直接访问路径吗?另一个未提及的问题是,每一行每次都会解析值,这意味着如果另一个线程修改了值(或者如果属性getter修改了它们…)随后的行可能会产生完全不同的结果。例如,如果第二个线程为不同的对象交换
objC
,那么多次解析
objE
实际上可能会导致不同的对象引用。您的第二个示例完全消除了这种可能性。是的,但是…为什么不回答这个问题呢n被问到:在C#/.NET中,编译器不会消除常见的子表达式,因此手动消除它们总是会导致速度加快。速度是否可检测是另一个问题。@romkyns-没错。加速(?)这不是问题所在。我宁愿指出第一种方法确实存在的突出的大问题。而且,你永远不知道未来版本的编译器是否能够消除子表达式…@Oded我怀疑未来版本是否能够做到这一点,特别是当它们是属性而不是字段时。(我个人不希望发生这种情况)@ChrisSinclair——不是说会,只是说这是可能的。