2011-02-10 7 views
17

Можно создать дубликат:
How to check the number of bytes consumed by my Structure?Получить размер структуры в C#

У меня есть структуры в упакованном виде

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct test 
{ 
    public int a; 
    public uint16 b; 
} 

Как получить размер структура как компилятор утверждает, что sizeof может использоваться только в небезопасном контексте?

Спасибо.

+0

Для чего это необходимо? –

+2

Мне нужно отправить его по сети. Я получил API, в котором мне нужно указать байты структуры, включая заголовок + данные и т. Д. – Nick

+0

Посмотрите на http://stackoverflow.com/questions/2418749/c-why-sizeof-is-unsafe-and-how -to-get-size-of-a-struct-in-a-safe-way – Ray

ответ

1

Вы помещаете оператор sizeof в небезопасный контекст, как это предлагает компилятор?

Нечто подобное я думаю:

int size; 
unsafe 
{ 
    size=sizeof(Test); 
} 

Но я не уверен, что если вы действительно хотите, чтобы сделать это. Я бы использовал обычный сериализатор вместо структур с конкретным макетом для этого. IMO, вы должны использовать такие структуры только для встроенного взаимодействия, а не для простой сериализации.

И, смотря на документацию функции marshalling SizeOf, можно испортить размер (не в этом примере).

+2

Это все равно даст ошибку компиляции. –

+0

@ JohnB.Lambe Что значит? Этот код компилирует и возвращает '6', как и ожидалось (после устранения тривиальных ошибок в коде OP) – CodesInChaos

+0

@Porges' unsafe' не является заразным. Вам просто нужно использовать соответствующий флаг для сборки и пометить соответствующий кодовый блок 'unsafe'. – CodesInChaos

24

Метод SizeOf делает трюк.

int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Point)); 
+1

Чтобы быть более конкретным, это System.Runtime.InteropServices.Marshal.SizeOf, применяемый к экземпляру. Должны возвращать те же результаты, что и язык «sizeof», применяемый к типу. Пример ниже. –

+0

Это работало в сочетании с комментарием Reb.Cabin. Спасибо, теперь я действительно могу узнать, какая эффективная структура и что нет. – Madmenyo

+1

typeof (Point), Point - это класс. Со структурой это дает мне исключение !! Попробуйте int size = System.Runtime.InteropServices.Marshal.SizeOf (typeof (test)); – MrHIDEn

Смежные вопросы