Что означает StructLayout.Auto по сравнению с последовательным и явным? - PullRequest
1 голос
/ 08 февраля 2012

Я думаю, что LayoutKind.Sequential и LayoutKind.Explicit понятны, но как LayoutKind.Auto обрабатывается C #?

Ответы [ 4 ]

4 голосов
/ 08 февраля 2012

LayoutKind.Auto просто означает: «Я даю CLR разрешение переупорядочивать байты, соответствующие этим полям».Он решает, как именно реорганизовать поля для использования памяти, упаковки и так далее. То, какие именно изменения произойдут, не указано в документации, возможно, потому, что это деталь реализации, которая не имеет отношения к тому, как вы пишете свои структуры.

Это неизменно плохоесли вы переходите к неуправляемому коду, потому что неуправляемый код ожидает, что эти поля будут в определенном порядке.Их возможная перестройка неизбежно приведет к непредвиденным последствиям.Вот почему вы не можете выставить LayoutKind.Auto структуры неуправляемому коду.

1 голос
/ 08 февраля 2012

Документация кажется довольно ясной:

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

Другими словами, макет является динамическим и означает, что ваш объект больше не может использоваться за пределами управляемого кода.

1 голос
/ 08 февраля 2012

МС говорит здесь

В общеязыковой среде исполнения по умолчанию используется значение Auto layout. к уменьшить проблемы, связанные с макетом, связанные со значением Auto, C #, Компиляторы Visual Basic и C ++ задают последовательное расположение для значения типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...