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

C# 匿名实例化语法-好还是坏?,c#,performance,syntax,C#,Performance,Syntax,对于仅使用实例化对象一次的快速任务,我知道我可以执行以下操作: int FooBarResult = (new Foo()).Bar(); 我说这对于非一次性物品来说是完全可以接受的,并且比其他选择更具可读性: Foo MyOnceUsedFoo = new Foo(); int FooBarResult = MyOnceUsedFoo.Bar(); 您使用哪种,为什么使用? 您会在生产应用程序中使用这种匿名实例化吗? 首选项:带括号“(new Foo()).Bar();”还是不带“new

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

int FooBarResult = (new Foo()).Bar();
我说这对于非一次性物品来说是完全可以接受的,并且比其他选择更具可读性:

Foo MyOnceUsedFoo = new Foo();
int FooBarResult = MyOnceUsedFoo.Bar();
您使用哪种,为什么使用?
您会在生产应用程序中使用这种匿名实例化吗?
首选项:带括号“(new Foo()).Bar();”还是不带“new Foo().Bar();”


(编辑以将问题从随机类中抽象出来)

关于随机数的旁注:事实上,不,您的具体示例(
new Random().Next(0100)
)是完全不可接受的。生成的随机数将远远不统一


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


顺便说一句,如果您选择使用单行大小写,请省略不必要的参数(
newmyobject().Method()
就可以了)。

如果只使用一次对象,则第一种方法总是更好

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


无论如何,它可能会编译为相同的CIL,因此第二种形式没有任何优势

第一句话。它更具可读性,代码更少,并且不会留下临时值

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

我两种方法都做过,并没有特别的偏好。我更喜欢那些看起来更可读的东西,这在很大程度上取决于被调用的类和方法的复杂性


顺便说一句,你可能想选择一个不同的例子。我担心你的观点可能会在关于生成随机数的最佳方法的讨论中被忽略。

事实上,第一种方法,创建一个临时值,由于两个原因更具可读性:

1) 它更简洁

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

2) 它传达了第二种形式所没有的东西,即对象正在临时使用

阅读它,我知道这个实例永远不会被再次使用,所以在我用来理解我正在阅读的代码的“心智编译器”中,我不必保留对它的引用,就像代码保留对它的引用一样

但是,正如Mehrdad所指出的那样,使用随机类进行操作并不是一个好主意

正如他还指出的,多余的括号使它不那么简洁;除非您身处语言的一个尘土飞扬的角落,否则请假设有能力的程序员知道该语言的运算符优先级。在这种情况下,即使我不知道运算符的优先级,替代解析(在函数返回时调用new)也是毫无意义的,因此“明显的”读取是正确的读取

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

第二个是调试友好的,而第一个不是。第二个赢是因为这一点。

如果只生成一个随机数,则没有分布。如果Random()的冷启动行为不好,那么无论哪种方式,都不会得到统一的数字。@danbruc:从技术上讲,这是一种分布,但我明白你的意思。你是对的。但我见过开发人员多次使用这种方法在循环中生成随机数。我认为在这里提到它是非常重要的。完全同意这一点-你甚至不应该考虑以这种方式生成多个数字。如果该方法采用了相当数量的参数,那么第一个选项的可读性可能会降低。可读性更像是语法而不是数学。规则通常是正确的,但有时违反规则会产生更好的代码。