Структурный указатель (адрес) и конструктор по умолчанию - PullRequest
0 голосов
/ 08 февраля 2019

Вызывает ли адрес структуры 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 Ответ

0 голосов
/ 08 февраля 2019

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

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

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

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

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

...