Должен ли я использовать LayoutKind.Auto для своих структур, если они не работают в COM Interop?
По умолчанию структуры в C# реализованы с [StructLayout( LayoutKind.Sequential )]
по причинам, в основном утверждающим, что эти типы объектов обычно используются для взаимодействия COM, и их поля должны оставаться в том порядке, в котором они были определены. Классы имеют LayoutKind.Auto
определены.
Мой вопрос заключается в том, должен ли я четко сформулировать свои структуры как [StructLayout( LayoutKind.Auto )]
и это даст мне какие-либо преимущества по умолчанию? Я имею в виду, что если структуры инициализируются в стеке, будет ли это иметь какое-то значение - т.е. GC не должен их перемещать? Также это поможет, когда структуры инициализируются в куче - т.е. являются частью некоторого класса?
2 ответа
Единственное возможное преимущество, о котором я могу думать, это то, что ваша структура занимает меньше памяти. Но если у вас такая большая структура, вы, вероятно, должны преобразовать ее в класс.
Потенциальная проблема заключается в том, что вы хотите, чтобы ваш Маршалл struct
в byte[]
с помощью Marshal.PtrToStructure
Как вы можете гарантировать, что порядок байтов будет таким, как вы ожидаете?
Делая это, кажется, вы представляете больше возможных проблем, чем тех, которые решаете... При этом, если порядок полей никогда не важен для вас, тогда делайте это, но имейте в виду, что следующий человек, который придет один может не ожидать этого.
Это может принести вам пользу, хотя я не думаю, что это будет много. Я обычно придерживаюсь значений по умолчанию.
По сути, с помощью автоматической компоновки CLR может выбрать способ выравнивания данных, поэтому, возможно, будет сделан некоторый компромисс между скоростью и скоростью (это также будет зависеть от платформы, в некоторых случаях сохранение выравнивания может быть более важным, чем в других). Однако, поскольку структуры также часто используются в стеке или в качестве составных вспомогательных структур (например, KeyValuePair), последовательные обычно имеют смысл по умолчанию.