В чем разница между `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.