Я понимаю, что решение использовать тип значения над ссылочным типом должно основываться на семантике, а не на производительности. Я не понимаю, почему типы значений могут легально содержать элементы ссылочного типа? Это связано с несколькими причинами:
Во-первых, мы не должны создавать конструкцию, требующую конструктора.
public struct MyStruct
{
public Person p;
// public Person p = new Person(); // error: cannot have instance field initializers in structs
MyStruct(Person p)
{
p = new Person();
}
}
Во-вторых, из-за семантики типа значения:
MyStruct someVariable;
someVariable.p.Age = 2; // NullReferenceException
Компилятор не позволяет мне инициализировать Person
в объявлении. Я должен переместить это в конструктор, полагаться на вызывающего абонента или ожидать NullReferenceException
. Ни одна из этих ситуаций не идеальна.
Есть ли в .NET Framework примеры ссылочных типов в типах значений? Когда мы должны это делать (если когда-либо)?