2010-04-28 335 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