Структурный указатель (адрес) и конструктор по умолчанию

Принимает ли адрес структуры C# вызов конструктора по умолчанию?

Например, я получил такие структуры:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct HEADER {
    public byte OPCODE;
    public byte LENGTH;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct S {
    public HEADER Header;
    public int Value;
}

Тогда, конечно, я не могу сделать это:

S s;                // no constructor call, so...
var v = s.Value;    // compiler error: use of possibly unassigned field 'Value'

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

S s;
S* ps = &s;
var v1 = ps->Value;        // OK, expected
var v2 = s.Value;          // OK!
var len = s.Header.LENGTH; // OK!

Итак, как-то он вызывает конструктор по умолчанию или - как только я беру адрес - C# перестает заботиться о памяти?

PS: память все равно инициализируется нулями.

1 ответ

Решение

Принимает ли адрес структуры C# вызов конструктора по умолчанию?

Нет. Это просто обходит проверку компилятором.

"Использование, возможно, неназначенного поля" - это хорошая защита для себя. Но это легко можно обойти. И в этом случае это не так критично.

PS: память все равно инициализируется нулями.

Да, это почти всегда (см. Ниже) будет иметь место в.NET, что делает вопрос "вызова конструктора по умолчанию" немного академическим. То, что происходит с вашей памятью, не так тесно связано с предупреждением компилятора.

Другие вопросы по тегам