55

まず、これを検索したところ、Stack Overflow で次のリンクが見つかりました。

しかし、私はこの答えに満足していません。よく説明されていません(よくわかりませんでした)。new object()基本的に、 と の違いを知りたいです new {}それらはコンパイル時と実行時にどのように扱われますか?

WebMethods次に、 asp.net シンプルなアプリケーションで使用した次のコードがあります。

[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 {}違いは?

これは私がコードを書いた正しい方法ですか? このコードの最良の方法を提案できますか?

私はそれをうまく説明することができず、私はたくさん尋ねていますが、それは私が今持っている最高のものです.

4

3 に答える 3

59

new {...}常に匿名オブジェクトを作成します。たとえば、次のようになります。

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

whileはクラスnew Object()のインスタンスを作成しますObject

  Object sample = new Object() {};
  String sampleName = sample.GetType().Name; // <- "Object"

すべてのオブジェクト (匿名のものを含む) はから派生しているため、Objectいつでも入力できます

  Object sample = new {};
于 2013-07-11T06:42:37.527 に答える
13

new Object()new {}と...の違いを確認するには、new Object(){}調べてみませんか?

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

最初の 2 つは、 Object と print を作成する別の方法ですSystem.Object。3 番目は、実際には匿名型であり、<>f__AnonymousType0.

「{}」のさまざまな用途に混乱している可能性があると思います。頭のてっぺんから、次の目的で使用できます。

  1. ステートメント ブロック。
  2. オブジェクト/コレクション/配列の初期化子。
  3. 匿名型

つまり、object data = new { };新しいオブジェクトを作成しません。これは新しい AnonymousType を作成します。これは、すべてのクラス、構造体、列挙型、およびデリゲートと同様に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();
}
于 2013-07-11T06:41:05.530 に答える