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"

whilenew 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());

前两个只是创建 Object 和 prints 的不同方式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();
}
于 2013-07-11T06:41:05.530 回答
8

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

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

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

于 2013-07-11T06:38:39.830 回答