Почему отладочная сборка приводит к еще одной переменной?

Это код:

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;
Другие вопросы по тегам