Представлены ли переменные в первичном конструкторе, выброшенных только при использовании только для инициализации свойсC#

Место общения программистов C#
Ответить
Anonymous
 Представлены ли переменные в первичном конструкторе, выброшенных только при использовании только для инициализации свойс

Сообщение Anonymous »

Я пытался выяснить это, используя онлайн-декомпилятор Sharplab C#, но я не совсем уверен, правильно ли я понял выход.

Код: Выделить всё

public class DeviceData
{
public required uint DeviceId { get; set; }
public required string Version { get; set; }
public required DeviceType Type { get; set; }
public required DeviceStatus Status { get; set; }
// ... lots of other properties
}
Код, который включал эти объекты, действительно доступ к DeviceID и Status , хотя. PrettyPrint-Override ">

Код: Выделить всё

public class DeviceDataStatus(DeviceData data)
{
public uint DeviceId { get; } = data.DeviceId;
public DeviceStatus Status { get; } = data.Status;
}
< /code>
Как видите, я использовал новый основной конструктор для этого. Но это заставило меня задуматься. < /P>
Ранее я использовал основной конструктор для инъекционных услуг (с использованием DI), и они использовались в классе не только на строительстве, но и когда Доступ к другим методам. 
Итак, мой вопрос: будет ли выброшенная привязанность Deciedata Data 
(которая просто является эталонным типом в этом примере) отбрасывается после строительства? Синтаксис): < /p>

Код: Выделить всё

public class DeviceDataStatus
{
public uint DeviceId { get; }
public DeviceStatus Status { get; }

public DeviceDataStatus(DeviceData data)
{
DeviceId = data.DeviceId;
Status = data.Status;
}
}
Я спрашиваю об этом, потому что оригинальный объект Devinedata больше не будет использоваться моим кодом, который больше создает DevedIcedAtaTatus , поэтому GC может (или будет?) Очистить его после этого. Полагаю, что во многих накладных планах памяти? Но если бы это не был ссылочным типом и довольно большой структурой, которая была бы полностью скопирована в первичный конструктор, это займет вдвое больше памяти.
, поэтому я быстро поместил бы два примера DevedIceedAtaTatus в декомпилер Sharplap, и это результаты:
используют первичный конструктор:

Код: Выделить всё

public class DeviceDataStatus
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly uint k__BackingField = data.DeviceId;

[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly DeviceStatus k__BackingField = data.Status;

public uint DeviceId
{
[CompilerGenerated]
get
{
return k__BackingField;
}
}

public DeviceStatus Status
{
[CompilerGenerated]
get
{
return k__BackingField;
}
}

[NullableContext(1)]
public DeviceDataStatus(DeviceData data)
{
}
}
< /code>
и использование нормального конструктора: < /p>
public class DeviceDataStatus
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly uint k__BackingField;

[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly DeviceStatus k__BackingField;

public uint DeviceId
{
[CompilerGenerated]
get
{
return k__BackingField;
}
}

public DeviceStatus Status
{
[CompilerGenerated]
get
{
return k__BackingField;
}
}

[NullableContext(1)]
public DeviceDataStatus(DeviceData data)
{
k__BackingField = data.DeviceId;
k__BackingField = data.Status;
}
}
< /code>
Вы можете видеть, что различия минимальны, но они, тем не менее, присутствуют. Использование первичного конструктора нет. Различия в значительной степени такие же, как и в некомпилированном коде. В коде первичного конструктора декомпилированный код поля поддержки устанавливается с использованием поля Data 
, которое даже не установлено из конструктора, которое, как я считаю странным.
Может быть>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-for-ini
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»