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

首先,我search了这个,我发现堆栈溢出以下链接:

  • 在c#中,new object()和new {}有什么不同?
  • 对象之间的区别a =新的狗()vs狗a =新的狗()

但是我不满意这个答案,这个问题没有解释得很清楚(我没有很好地理解)。 基本上,我想知道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; } 

所以,(如你可以在代码中看到的), new object(){}new {}差异?

这是甚至正确的方式,我已经写的代码? 你能build议这个代码的最佳途径吗?

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

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

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

new Object()创buildObject类的一个实例

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

因为所有的对象(包括匿名对象)都是从Object派生的,所以你总是可以input

  Object sample = new {}; 

要查看new Object()new Object()new {} new Object(){}之间的区别,为什么我们不明白?

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

前两个是创build对象并打印System.Object不同方法。 第三个实际上是一个匿名types,打印<>f__AnonymousType0

我想你可能会被“{}”的不同用法所困惑。 在我头顶上它可以用于:

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

所以,总之object data = new { }; 不会创build一个新的对象。 它创build一个新的AnonymousType,就像所有的类,结构体,枚举和委托inheritanceObject一样,因此可以分配给它。


正如评论中提到的那样,当返回匿名types时,你仍然声明并向下转换为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(); } 

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

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

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