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