Разница в явных и неявных инициализаторах класса C#

В чем разница между этими двумя инициализаторами классов? Кажется, что оба синтаксически верны в C#. Является ли второй ярлык для первого?

Class1 class1 = new Class1()
{
    Boolean1 = true,
    Class2Instance = new Class2
    {
        Boolean2 = true,
    },
};

а также

Class1 class1 = new Class1()
{
    Boolean1 = true,
    Class2Instance =
    {
        Boolean2 = true,
    },
};

Я спрашиваю, потому что, очевидно, это недопустимо:

Class1 class1 =
{
    Boolean1 = true,
    Class2Instance = new Class2()
    {
        Boolean2 = true,
    },
};

1 ответ

Решение

Два приведенных вами примера не совсем совпадают. Используя такой инструмент, как ILSpy, вы можете проверить, что создает компилятор для двух операторов.

Первый компилируется в нечто вроде следующего (декомпилируется с использованием ILSpy):

Class1 expr_06 = new Class1();
expr_06.Boolean1 = true;
expr_06.Class2Instance = new Class2
{
    Boolean2 = true
};

В то время как второй пример компилируется в следующее (декомпилируется с использованием ILSpy):

Class1 expr_06 = new Class1();
expr_06.Boolean1 = true;
expr_06.Class2Instance.Boolean2 = true;

Как вы можете видеть, во втором примере создание Class2Instance с new- ключевое слово отсутствует, и вы получите NullReferenceException при запуске этого кода.

Тем не менее, вы можете предотвратить получение NullReferenceException во втором примере, когда вы создаете новый Class2Instance в конструкторе вашего Class1:

class Class1
{
  public Class1()
  {
    Class2Instance = new Class2();
  }
}
Другие вопросы по тегам