【问题标题】:What is the Difference Between `new object()` and `new {}` in C#?C#中的`new object()`和`new {}`有什么区别?
【发布时间】:2021-05-10 14:40:25
【问题描述】:

首先我对此进行了搜索,并在 Stack Overflow 上找到了以下链接:

但我对这个答案并不满意,它没有得到很好的解释(我没有得到很好的解释)。 基本上,我想知道new object()new {} 之间的区别。 如何在编译时和运行时处理它们?

其次,我在我的 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;
}

那么,(正如您在代码中的 cmets 中看到的那样),new object(){}new {} 有何区别?

这甚至是我编写代码的正确方式吗? 您能否建议此代码的最佳方法?

我知道,我不能很好地解释它,我问了很多,但这是我现在最好的。

【问题讨论】:

  • 您的new{} 正在创建一个anonymous type
  • new {} 用于匿名类型,new object() 只是对象类的构造函数。
  • 我得到-1 的问题并不是那么糟糕
  • @Cyber​​maxs-Betclic,我知道结果类型是对象的匿名类型,但MSIL 如何处理它们?这会由 c# 编译器生成一个新的Anonymouse 类型的单独代码吗?
  • 这对我来说是新信息。我可以使用new {} 为所有对象类型创建实例吗?

标签: c# .net object


【解决方案1】:

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"

因为所有对象(包括匿名对象)都是从 Object 派生的,所以您可以随时输入

  Object sample = new {};

【讨论】:

  • 更好的解释。因此,这意味着,它们在运行时被视为 object 类型,编译器不会将其视为 anonymous 类型
  • @DotNetDreamer “它们在运行时被视为对象类型”是什么意思?所有对象都继承自Object 类,但Dimitry 的示例特别表明匿名对象的实际类型是not Object。
【解决方案2】:

要查看new Object()new {}new Object(){} 之间的区别...我们为什么不直接找出来?

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

前两个只是创建对象并打印System.Object 的不同方式。第三个其实是匿名类型,打印&lt;&gt;f__AnonymousType0

我认为您可能对“{}”的不同用法感到困惑。在我的脑海中,它可以用于:

  1. 语句块。
  2. 对象/集合/数组初始化器。
  3. 匿名类型

所以,简而言之,object data = new { }; 不会创建新对象。它创建了一个新的 AnonymousType,就像 all classes, structures, enumerations, and delegates 继承 Object 并因此可以分配给它。


如 cmets 中所述,当返回匿名类型时,您仍然需要将它们声明并向下转换为 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();
}

【讨论】:

  • 我的webmethodanonymouseobject 类型会返回什么?
  • 返回类型是对象 - 你不能返回匿名类型,因为......你实际上并不知道编译时的类型是什么。但是返回匿名类型(向下转换为对象)并返回对象可能会导致不同的行为 - 例如他们以不同的方式实现 ToString()。
  • 感谢您提供的新信息。我希望我有更多的 +1 给你 :)
【解决方案3】:

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

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

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

【讨论】:

  • 像几乎所有类型一样,匿名类型可以分配给对象”你能说出不能分配给对象的一个​​吗?
  • 明显的例子是指针。我认为还有一些东西,比如那些奇怪的参数迭代器或某些不能在 C# 中直接使用的引用。
  • c# 中的指针,很不安全……但一切都在“安全”部分。
  • @CodesInChaos 我明白了。感谢您的信息。
猜你喜欢
  • 2011-08-12
  • 2014-02-10
  • 2012-03-10
  • 1970-01-01
  • 2018-06-04
  • 2018-08-02
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多