2010-04-28 213 views
3

有什么区别:C#对象实例化

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

new Object().foo(); 

(假设我不需要参考之后)?

是否有任何理由使用一个而不是另一个(例如内存使用情况)?

回答

8

在执行方面没有任何区别。

可以在调试方面的差异:

  • 它可以很方便的对象被创建后打破,但foo()之前被称为
  • 它可以很方便的可以之后检查变量的值
  • 如果抛出异常,将呼叫分隔成多行可以使源更清晰。 (在这种情况下,我认为这不是一个问题,但特别是对于NullReferenceException s,如果在同一语句中有多个解除引用操作可能会非常棘手)。

我绝对不,你应该总是拆东西展现出来 - 只是它可以是用于调试。

+0

Skeet先生,你再次击中! – user1112111 2010-04-28 12:12:40

+0

另一个区别是 - 一旦声明 - 你不能在同一个范围内再次使用变量名o。可能是一个有争议的问题,但仍然存在差异。 – Jono 2010-04-28 12:29:12

+0

@Jono,认为范围你真的是指声明空间。 http://blogs.msdn.com/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx – Fede 2010-04-28 12:57:08

6

如果以后不需要实例,则没有区别。

2

如果你不需要o后缀,那么没有区别。 (JIT)编译器可能将它们视为相同。

所以这是一个品味问题。在这种情况下,我对第一个样本略有偏好,但有时第二个样本的流畅符号更具可读性。

0

没有区别。

要探测它,你可以编译两个代码(发布模式),用ildasm检查它们,你会看到生成的字节代码是相同的。

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

-1

编辑:删除不正确的代码

不同的是,在第一种情况下,你可以看到在调试器创建的对象。

+0

您可以重复使用它。 – Femaref 2010-04-28 12:00:22

+0

@Femaref:什么? – user1112111 2010-04-28 12:04:04

+0

@Daniel Rose:实际上这不会编译,应该为拥有'foo'方法的类创建一个类,但是谢谢你的答案 – user1112111 2010-04-28 12:04:59