Я понимаю, что решение об использовании типа значения вместо ссылочного типа должно основываться на семантике, а не на производительности. Я не понимаю, почему типы значений могут законно содержать члены ссылочного типа? Это происходит по нескольким причинам.:
Во-первых, мы не должны создавать структуру, требующую конструктора.
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 примеры ссылочных типов внутри типов значений? Когда мы должны это сделать (и вообще )?