В чем разница между `new object()` и `new {}` в С#?
Прежде всего, я искал это, и я нашел следующие ссылки в Stack Overflow:
Но я не удовлетворен с этим ответом, он не очень хорошо объяснил (я не понял это хорошо).
В принципе, я хочу знать разницу между new object()
и new {}
. Как они обрабатываются во время компиляции и времени выполнения?
Secondaly, у меня есть следующий код, который я использовал для 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 {}
?
Является ли это даже правильным способом написать код?
Можете ли вы предложить лучший способ для этого кода?
Я знаю, я не могу объяснить это хорошо, и я спрашиваю много, но это лучшее, что у меня есть сейчас.
Ответы
Ответ 1
new {...}
всегда создает анонимный объект, например:
Object sample = new {};
String sampleName = sample.GetType().Name; //<- something like "<>f__AnonymousType0"
// not "Object"
while new Object()
создает экземпляр класса Object
Object sample = new Object() {};
String sampleName = sample.GetType().Name; // <- "Object"
поскольку все объекты (в том числе анонимные) получены из Object
, вы всегда можете напечатать
Object sample = new {};
Ответ 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
. Третий фактически анонимный тип и печатает <>f__AnonymousType0
.
Я думаю, вас могут смутить разные варианты использования '{}'. Сверху моей головы он может использоваться для:
- Блоки операторов.
- Инициализаторы объектов/коллекции/массива.
- Анонимные типы
Итак, короче object data = new { };
не создает новый объект. Он создает новый анонимный тип, который, как все классы, структуры, перечисления и делегаты наследует 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();
}
Ответ 3
new{ }
создает экземпляр анонимного типа без членов. Это отличается от создания экземпляра object
. Но, как и почти все типы, анонимные типы могут быть назначены объекту.
object data = new { };
Console.WriteLine(data.GetType().Name)
Четко отображается автогенерированное имя, а не object
.