Почему отладочная сборка приводит к еще одной переменной?
Это код:
Employee e = new Employee() { Name = "Jeff", Age = 45 };
И вот как он компилируется при сборке отладочной сборки:
Employee employee = new Employee();
employee.Name = "Jeff";
employee.Age = 45;
Employee employee2 = employee;
И вот как он компилируется при создании релиза:
Employee employee = new Employee();
employee.Name = "Jeff";
employee.Age = 45;
Вопрос в том, почему отладочная сборка приводит к еще одной переменной, которая ссылается на тот же объект?
2 ответа
SharpLab берет скомпилированный IL и пытается преобразовать его обратно в читаемый C#, в результате C# не всегда точно совпадает с исходно скомпилированным кодом.
Если вместо этого мы смотрим на сгенерированный IL, в режиме отладки мы получаем следующее (я удалил некоторые инструкции nop (no-op), чтобы сохранить порядок:
.locals init (
[0] class Employee
)
IL_0001: newobj instance void Employee::.ctor()
IL_0006: dup
IL_0007: ldstr "Jeff"
IL_000c: callvirt instance void Employee::set_Name(string)
IL_0012: dup
IL_0013: ldc.i4.s 45
IL_0015: callvirt instance void Employee::set_Age(int32)
IL_001b: stloc.0
IL_001c: ret
В релизе это практически идентично:
IL_0000: newobj instance void Employee::.ctor()
IL_0005: dup
IL_0006: ldstr "Jeff"
IL_000b: callvirt instance void Employee::set_Name(string)
IL_0010: dup
IL_0011: ldc.i4.s 45
IL_0013: callvirt instance void Employee::set_Age(int32)
IL_0018: pop
IL_0019: ret
Единственное реальное отличие состоит в том, что, когда версия отладки выделяет локальную переменную для employee
версия выпуска не делает, так как она никогда не используется, и поэтому не требуется.
Как мы видим, "дополнительной" переменной, которую вы видите в версии Debug, на самом деле не существует, это всего лишь артефакт попытки SharpLab преобразовать скомпилированный IL обратно в читаемый C#, и на самом деле версия Release "потеряла" локальную версию. переменная, потому что это не требуется.
Я думаю, вы должны создать свой второй объект, как это.
Employee employee2 = new Employee();
затем
employee2= employee;