2013-07-11 87 views
38

首先我搜索了這一點,我發現對堆棧溢出以下鏈接:C#中new object()和new {}之間的區別是什麼?

,但我不滿意這個答案,這不是解釋得很好(我沒有得到它)​​。 基本上,我想知道new object()new {}之間的區別。 如何在編譯時和運行時處理它們?

Secondaly,我有以下的代碼,我在我的asp.net簡單的應用程序用於WebMethods

[WebMethod] 
[ScriptMethod(UseHttpGet = false)] 
public static object SaveMenus(MenuManager proParams) 
{ 
    object data = new { }; // here im creating an instance of an 'object' and i have typed it `new {}` but not `new object(){}`. 
    try 
    { 
     MenuManager menu = new MenuManager();  
     menu.Name = proParams.Name; 
     menu.Icon = proParams.Icon; 
     bool status = menu.MenuSave(menu); 
     if (status) 
     { 
      // however, here i'm returning an anonymous type 
      data = new 
      { 
       status = true, 
       message = "Successfully Done!" 
      }; 
     } 
    } 
    catch (Exception ex) 
    { 
     data = new { status = false, message = ex.Message.ToString() }; 
    } 
    return data; 
} 

所以,(你可以在代碼註釋中看到),如何new object(){}new {}差異?

這是甚至正確的方式,我寫代碼? 你能爲這段代碼提供一個最好的方法嗎?

我知道了,我不能很好地解釋它,我問很多,但這是我現在最好的。

+6

你'新{}'是建立一個[匿名類型(http://msdn.microsoft.com/en-us/library/vstudio/bb397696 .aspx) – CodesInChaos

+4

new {}用於匿名類型,new object()只是對象類的構造函數。 – Cybermaxs

+0

這並不是什麼太壞的問題,我得到了'-1' –

回答

41

new {...}始終創建一個匿名對象,例如:

Object sample = new {}; 
    String sampleName = sample.GetType().Name; //<- something like "<>f__AnonymousType0" 
              //     not "Object" 

new Object()創建

Object類的一個實例
Object sample = new Object() {}; 
    String sampleName = sample.GetType().Name; // <- "Object" 

因爲所有對象(包括anony諒解備忘錄的人)從Object衍生您可以鍵入

Object sample = new {}; 
+0

更好的解釋。所以,這意味着,它們在運行時被視爲'object'類型,並且編譯器不會將其視爲'anonymous'類型。 –

+3

@DotNetDreamer你是什麼意思「它們在運行時被當作對象類型」?所有對象都從Object類繼承,但Dimitry的例子明確表明匿名對象的實際類型是_not_Object。 – JLRishe

+0

@Dmitry Bychenko,我感謝你的寶貴時間:) –

8

new{ }創建一個沒有成員的匿名類型的實例。這與創建object的實例不同。但是和幾乎所有類型一樣,匿名類型可以分配給對象。

object data = new { }; 
Console.WriteLine(data.GetType().Name) 

清楚地顯示一個自動生成的名稱,而不是Object

+0

「*就像幾乎所有類型一樣,匿名類型可以分配給對象*」你可以命名一個不可以的名稱嗎? –

+4

明顯的例子是指針。我認爲還有更多,像那些奇怪的參數迭代器或某些類型的引用無法在C#中直接使用的東西。 – CodesInChaos

+0

在C#中的指針,所以不安全......但一切都在「安全」部分。 –

12

要查看new Object()new {}new Object(){}之間的區別...爲什麼我們不明白?

Console.WriteLine(new Object().GetType().ToString()); 
Console.WriteLine(new Object() { }.GetType().ToString()); 
Console.WriteLine(new { }.GetType().ToString()); 

前兩個是創建一個對象,並打印System.Object的只是不同的方式。第三個實際上是一個匿名類型,並打印<>f__AnonymousType0

我想你可能會對'{}'的不同用法感到困惑。關於我的頭頂,它可用於:

  1. 聲明塊。
  2. 對象/集合/數組初始化器。
  3. 匿名類型

因此,簡而言之object data = new { };不創建一個新的對象。它創建一個新的AnonymousType,像all classes, structures, enumerations, and delegates繼承Object並且因此可以分配給它。


正如評論中所述,當返回匿名類型時,您仍然有聲明並將它們向下轉換爲Object。然而,他們仍然是不同的東西,有例如一些實現差異:

static void Main(string[] args) 
{ 
    Console.WriteLine(ReturnO(true).ToString()); //"{ }" 
    Console.WriteLine(ReturnO(false).ToString()); // "System.Object" 

    Console.WriteLine(ReturnO(true).Equals(ReturnO(true))); //True 
    Console.WriteLine(ReturnO(false).Equals(ReturnO(false))); //False 
    Console.WriteLine(ReturnO(false).Equals(ReturnO(true))); //False 

    Console.WriteLine(ReturnO(true).GetHashCode()); //0 
    Console.WriteLine(ReturnO(false).GetHashCode()); //37121646 

    Console.ReadLine(); 
} 

static object ReturnO(bool anonymous) 
{ 
    if (anonymous) return new { }; 
    return new object(); 
} 
+0

我的'webmethod'返回'anonymouse'或'object'類型是什麼? –

+1

返回類型是對象 - 你不能返回匿名類型,因爲......你實際上並不知道在編譯時類型是什麼。然而,返回匿名類型(向下轉換爲對象)並返回對象可能會導致不同的行爲 - 例如他們以不同的方式實現ToString()。 – NPSF3000

+1

感謝您的新信息。我希望我有更多然後+1 :) –

相關問題