Имеет ли смысл определять структуру с элементом ссылочного типа?

Есть ли смысл в определении структуры с элементом ссылочного типа (и не определяя его как class)? Например, чтобы определить эту структуру:

public struct SomeStruct { string name; Int32 place; } 

Я спрашиваю, потому что я знаю, что struct является типом значения, и определить в нем какой-то ссылочный тип не имеет никакого смысла.

Я прав? Может кто-нибудь объяснить это?

    Девять раз из десяти вы должны создать class, а не структуру в первую очередь. Структуры и classы имеют очень разную семантику в C #, например, по сравнению с тем, что вы можете найти на C ++. Большинство программистов, которые используют структуру, должны использовать class, делая такие вопросы, как этот, совершенно откровенно неуместным.

    Вот несколько быстрых правил о том, когда вы должны выбрать структуру над classом:

    1. Никогда.
      … О, ты все еще читаешь? Вы настойчивы. В порядке отлично.
    2. Когда у вас есть явная потребность в семантике типа значения, в отличие от семантики ссылочного типа.
    3. Когда у вас очень маленький тип (эмпирическое правило имеет размер памяти менее 16 байт).
    4. Когда объекты, представленные вашей структурой, будут недолговечными и неизменными (не изменятся).
    5. И время от времени, для целей взаимодействия с собственным кодом, который использует структуры.

    Но если вы приняли обоснованное решение и действительно уверены, что на самом деле вам нужна структура, а не class, вам нужно пересмотреть точку 2 и понять, что такое семантика типа значения. Статья Джона Скита здесь должна пройти долгий путь к разъяснению различия.

    После того, как вы это сделали, вы должны понять, почему определение ссылочного типа внутри типа значения (struct) не является проблемой. Типы ссылок похожи на указатели. Поле внутри структуры не сохраняет фактический тип; скорее, он сохраняет указатель (или ссылку) на этот тип. Нет ничего противоречивого или неправильного в объявлении структуры с полем, содержащим ссылочный тип. Он не будет «замедлять объект» и не «вызовет GC», две проблемы, которые вы выражаете в комментарии.

    Объявление поля ссылочного типа означает, что должно быть пространство для хранения значения ссылки, указывающей на целевой объект. Таким образом, имеет смысл иметь такие поля в структурах.

    Мне интересно услышать, что более опытные кодеры должны сказать о плюсах и минусах этого, но я понимаю, что в качестве типа значения переменная типа SomeStruct будет выделена из стека, но будет содержать ссылку на расположение в куче, содержащей строку.

    В общем случае структура должна содержать только общедоступное и / или изменяемое поле ссылочного типа, если применяется одно из следующих условий:

    1. Все экземпляры этого типа могут считаться неотъемлемо неизменными (как в случае с `string`)
    2. Семантика структуры ясно подразумевает, что поле идентифицирует объект, к которому он относится, вместо того, чтобы инкапсулировать его состояние и что состояние объекта, на которое указывает поле, не считается частью структуры. Например, в KeyValuePair можно было бы ожидать, что `Value` будет идентифицировать экземпляр формы; перемещение формы вокруг экрана изменит значение «Value.Bounds», но не будет считаться измененным значением «Value» (которое будет продолжать ссылаться на одну и ту же форму независимо от ее местоположения на экране)

    Если ни одно из условий не применяется, может быть уместно, чтобы структура удерживала поле ссылочного типа при условии соблюдения следующих условий:

    1. В поле никогда не содержится ссылки на любой изменяемый объект, который сама структура не создала.
    2. Ссылка никогда не должна подвергаться и никогда не подвергаться воздействию какого-либо кода, который в будущем может повлиять на объект, на который он ссылается.
    3. Все мутации, которые когда-либо будут выполняться на объекте, к которому будет направляться поле, должны быть выполнены до того, как ссылка будет сохранена в поле.

    Другими словами, ссылка на объект, которая используется для инкапсуляции состояния объекта (в отличие от простого его определения), должна храниться только в поле структуры, если нет пути выполнения, через который может быть изменен объект, к которому он относится. ,

    Давайте будем гением компьютера.