C#对象实例化

3

以下是“什么是”的区别:

Object o = new Object();
o.foo();

并且

new Object().foo();

假设之后我不需要引用,有没有使用其中一个而不是另一个的原因(例如内存使用)?

5个回答

8

在执行方面没有区别。

在调试方面可能会有所不同:

  • 在对象创建后但在调用foo()之前中断可能很方便
  • 可以方便地检查变量的值
  • 如果抛出异常,将调用分成多行可以使源代码更清晰。 (我认为在这种特定情况下不会有问题,但对于特别是NullReferenceException的情况,如果在同一语句中有多个取消引用操作,则可能会有些棘手)。

我绝对不是说您应该始终将所有内容拆分 - 只是说它可能对调试目的有用。


另一个区别是,一旦声明,您无法在同一作用域中再次重用变量名称o。这可能是一个无关紧要的点,但仍然存在差异。 - Jono
@Jono,我认为你所指的范围实际上是声明空间。http://blogs.msdn.com/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx - Fede
@Fede,我只是在重复编译器错误的内容:在此范围内已经声明了一个名为'o'的局部变量。然后我们开始离题... - Jono

6
如果您之后不需要该实例,则没有任何区别。

2
如果之后不需要 o,那么它们没有区别。
(JIT)编译器可能会将它们视为相同。
所以这是一个品味问题。在这种情况下,我略微偏爱第一个,但有时第二个示例的流畅符号更易读。

0

没有差异。

要进行验证,你可以编译这两段代码(发布模式),使用 ildasm 进行检查,你会发现生成的字节码是相同的。

编辑:实际上,有时候当变量被声明时,我发现调试更加容易。更容易检查,因此更容易调试。


-1

编辑:已删除错误代码

区别在于第一种情况下,您可以在调试器中看到正在创建的对象。


@Daniel Rose:实际上,那也无法编译,应该为具有foo方法的类进行转换,但感谢你的回答。 - user1112111
1
@Daniel:你为什么需要那样做?那些括号是不必要的。 - Jon Skeet
@user1112111:我重用了你的代码。显然,Object()没有foo方法。@Jon Skeet:你是对的。我的错。 - Daniel Rose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接