2013-07-11 8 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を入力することができますObjectから派生しています.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 sample = new {}; 
+0

はるかに良い説明。つまり、実行時に 'object'型として扱われ、コンパイラは' anonymous'型として扱われません。 –

+3

@DotNetDreamer「実行時にオブジェクト型として扱われる」とはどういう意味ですか?すべてのオブジェクトは 'Object'クラスから継承しますが、Dimitryの例では、匿名オブジェクトの実際の型が_not_ Objectであることが具体的に示されています。 – JLRishe

+0

@ドミトリー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()); 

最初の2つは、オブジェクトと印刷System.Objectを作成するだけでさまざまな方法です。 3番目は実際には匿名のタイプで、<>f__AnonymousType0を出力します。

あなたは '{}'のさまざまな使い方によって混乱するかもしれないと思います。私の頭の上からそれを使用することができます:

  1. 文ブロック。
  2. オブジェクト/コレクション/配列の初期設定。だから、
  3. 匿名型

、短いobject data = new { };に新しいオブジェクトを作成しません。それはall classes, structures, enumerations, and delegatesのようにObjectを継承し、そのために割り当てることができる新しいAnonymousTypeを作成します。


コメントに記載されているように、匿名型を返すときには、依然として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を持っていたらいいよ:) –

関連する問題