Структурный указатель (адрес) и конструктор по умолчанию
Принимает ли адрес структуры 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, что делает вопрос "вызова конструктора по умолчанию" немного академическим. То, что происходит с вашей памятью, не так тесно связано с предупреждением компилятора.