Разница в явных и неявных инициализаторах класса 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();
}
}