匿名实例化语法 - 好还是坏?

时间:2009-04-04 13:02:07

标签: c# performance syntax

对于我只使用一次实例化对象的快速任务,我知道我可以执行以下操作:

int FooBarResult = (new Foo()).Bar();

我说这对于非一次性物品是完全可以接受的,并且比替代物更具可读性:

Foo MyOnceUsedFoo = new Foo();
int FooBarResult = MyOnceUsedFoo.Bar();

你使用哪种,为什么?
你会在生产应用程序中使用这种类型的匿名实例化吗? 偏好:带括号“(new Foo())。Bar();”或者没有“new Foo()。Bar();”?

(编辑为摘自随机类的问题)

6 个答案:

答案 0 :(得分:8)

有关随机数的附注:事实上,不,您的具体示例(new Random().Next(0,100))是完全不可接受的。生成的随机数远非均匀。


除此之外,一般情况下,两者之间没有太大差异。在任何一种情况下,编译器很可能会生成完全相同的代码。您应该使用最易读的案例(长语句可能会损害可读性;更多代码也会这样做,因此您必须在特定情况下进行权衡)。

顺便说一句,如果您选择使用单行案例,请省略不必要的parens(new MyObject().Method()会这样做。)

答案 1 :(得分:6)

您可能想要考虑在调试器中使用代码的含义。第二种情况将允许您检查您创建的对象,而第一种情况则不会。当然,当您尝试调试代码时,您总是可以回到第二种情况。

我已经做到了两种方式,并没有真正的偏好。我更喜欢看起来更具可读性的东西,这在很大程度上取决于被调用的类和方法的复杂性。

顺便说一句 - 您可能想要选择一个不同的例子。我担心在讨论生成随机数的最佳方法时,你的观点可能会丢失。

答案 2 :(得分:3)

如果您只使用一次对象,第一种方式总是更好。

它更短更清晰,因为它明确表示您以后不会使用该对象。

无论如何它可能会编译到同一个CIL,所以第二种形式没有任何优势。

答案 3 :(得分:1)

第一个声明。它更具可读性,代码更少,并且不会留下温度。

答案 4 :(得分:1)

第二个是调试友好,而第一个不是。第二个胜利只是因为这个。

答案 5 :(得分:0)

事实上,创建临时的第一种方式更具可读性有两个原因:

1)它更简洁

要读取的代码较少,没有引入不必要的局部变量,也没有潜在的名称与另一个局部冲突,或者在封闭范围内隐藏任何具有相同名称的变量

2)它传达第二种形式没有的东西,即临时使用该物体。

读它,我知道那个实例永远不会被再次使用,所以在我用来理解我正在阅读的代码的“心理编译器”中,我不必保留任何引用它不止代码保留对它的引用。

正如Mehrdad指出的那样,使用Random类做这件事并不是一个好主意。

正如他所指出的那样,多余的括号使它不那么简洁;除非你处于语言的尘埃落定的角落,否则假设有能力的程序员知道语言的运算符优先级。在这种情况下,即使我不知道运算符优先级,替代解析(在函数返回时调用new)也是荒谬的,因此“明显”读数是正确的读数。

int RandomIndex = (new Random()).Next(0,100);
int RandomIndex = new Random().Next(0,100);