C#中`new object()`和`new {}`有什么区别?

Dot*_*mer 45 .net c#

首先,我搜索了这个,我在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;
}
Run Code Online (Sandbox Code Playgroud)

那么,(正如你在代码中的评论中看到的),如何new object(){}new {}差异?

这是我编写代码的正确方法吗? 你能为这段代码建议一个最好的方法吗?

我知道,我不能很好地解释它,我要求很多,但这是我现在最好的.

Dmi*_*nko 49

new {...}总是创建一个匿名对象,例如:

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

同时new Object()创建一个Object类的实例

  Object sample = new Object() {};
  String sampleName = sample.GetType().Name; // <- "Object"
Run Code Online (Sandbox Code Playgroud)

由于所有对象(包括匿名对象)都是从中派生出来的,因此Object您始终可以键入

  Object sample = new {};
Run Code Online (Sandbox Code Playgroud)

  • @DotNetDreamer你的意思是"它们在运行时被视为对象类型"?所有对象都继承自`Object`类,但Dimitry的示例专门显示匿名对象的实际类型是_not_ Object. (3认同)

NPS*_*000 12

看之间的差别new Object()new {}new Object(){}......为什么我们不知道的?

Console.WriteLine(new Object().GetType().ToString());
Console.WriteLine(new Object() { }.GetType().ToString());
Console.WriteLine(new { }.GetType().ToString());
Run Code Online (Sandbox Code Playgroud)

前两个只是创建对象和打印的不同方式System.Object.第三个实际上是一个匿名类型和打印<>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();
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*aos 8

new{ }创建一个没有成员的匿名类型的实例.这与创建实例不同object.但是几乎所有类型都可以将匿名类型分配给对象.

 object data = new { };
 Console.WriteLine(data.GetType().Name)
Run Code Online (Sandbox Code Playgroud)

清楚地显示自动生成的名称,而不是Object.

  • 明显的例子是指针.我认为还有更多,像那些奇怪的参数迭代器或某些类型的引用,不能直接在C#中使用. (4认同)