首先,我搜索了这个,我在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;
}
那么,(正如您在代码中的评论中所看到的),new object(){}
和new {}
的差异如何?
这是我编写代码的正确方法吗? 你能为这段代码建议一个最好的方法吗?
我知道,我无法解释它并且我要求很多,但这是我现在最好的。
答案 0 :(得分:48)
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 {};
答案 1 :(得分:12)
要查看new Object()
与new {}
和new Object(){}
之间的区别......为什么我们不知道呢?
Console.WriteLine(new Object().GetType().ToString());
Console.WriteLine(new Object() { }.GetType().ToString());
Console.WriteLine(new { }.GetType().ToString());
前两个只是创建对象的不同方式并打印System.Object
。第三个实际上是一个匿名类型并打印<>f__AnonymousType0
。
我认为你可能会对“{}”的不同用法感到困惑。在我的头顶,它可以用于:
因此,简而言之object data = new { };
不会创建新对象。它创建一个新的AnonymousType,像all classes, structures, enumerations, and delegates一样继承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();
}
答案 2 :(得分:8)
new{ }
创建一个没有成员的匿名类型的实例。这与创建object
的实例不同。但是几乎所有类型都可以将匿名类型分配给对象。
object data = new { };
Console.WriteLine(data.GetType().Name)
清楚地显示自动生成的名称,而不是Object
。