Что делает пустая структура в С#?

Если вы объявили struct:

struct EmptyResult
{
}

Каков результат создания переменной типа EmptyResult в экземпляре?

public Foo()
{
    EmptyResult result;
}

Ожидаете ли вы распределение в стеке, или это эффективно не-op?

Ответ 1

Компилятор С# заставляет пустую структуру иметь размер 1 байт. Вы можете увидеть это, если вы посмотрите на структуру в декомпиляторе:

[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}

Таким образом, любой экземпляр этой структуры в классе или в стеке будет занимать 1 байт, точно так же, как экземпляр System.Byte или System.SByte

Ответ 2

Структура С# без полей по-прежнему имеет размер 1. Причина в том, что компилятор должен иметь возможность принимать адрес структуры с помощью оператора & в небезопасном коде.

Я ожидал бы, что ваш тип структуры будет обрабатываться точно так же, как тип byte.

Ответ 3

Я думаю, что это распределение стека, что соответствует тому, как работают не ссылочные типы.

Ответ 4

Если вы используете idlasm.exe для изучения il, в строке, в которой вы создаете экземпляр структуры Empty, вы увидите:

.maxstack  1
.locals init ([0] valuetype Draft.Empty e)

И определение Empty struct:

.class private sequential ansi sealed beforefieldinit Draft.Empty
       extends [mscorlib]System.ValueType
{
  .pack 0
  .size 1
} // end of class Draft.Empty

Как вы видите, он выделяет 1 байт при создании времени, а в определении размер этого типа равен 1.

Так что да; он выделяет 1 байт в стеке.

Примечание: определение Empty извлечено из скомпилированной сборки в режиме выпуска.