Можно поместить обе настройки в machine.config, и затем они доступны для всего Вы приложения на сервере.
Вам не нужно беспокоиться о каком-либо снижении производительности из-за инструкции блока
, потому что, если его аргумент является ссылочным типом, инструкция box
ничего не делает. Хотя все еще странно, что инструкция box
даже была создана (может быть, лень / упрощенный дизайн при генерации кода?).
Я не уверен почему возникает бокс. Один из возможных способов избежать бокса - не использовать его. Просто перекомпилируйте без бокса. Пример:
.assembly recomp_srp
{
.ver 1:0:0:0
}
.class public auto ansi FixedPBF
{
.method public instance void .ctor() cil managed
{
}
.method hidebysig public instance void SetRefProperty<class T>(!!T& propertyBackingField, !!T newValue) cil managed
{
.maxstack 2
.locals init ( bool isDifferent, bool CS$4$0000)
ldc.i4.0
stloc.0
ldarg.1
ldobj !!T
ldarg.2
ceq
stloc.1
ldloc.1
brtrue.s L_0001
ldc.i4.1
stloc.0
L_0001: ret
}
}
... если вы сохраните файл Recomp_srp.msil, вы можете просто перекомпилировать его как таковой:
ildasm / dll Recomp_srp.msil
И он работает нормально без бокса на моем конце:
FixedPBF TestFixedPBF = new FixedPBF();
TestFixedPBF.SetRefProperty<string>(ref TestField, "test2");
... конечно, я изменил его с защищенного на общедоступный, вам нужно будет снова внести изменения и предоставить остальную часть вашей реализации.
Я не уверен, почему так происходит бокс. Один из возможных способов избежать бокса - не использовать его. Просто перекомпилируйте без бокса. Пример:.assembly recomp_srp
{
.ver 1:0:0:0
}
.class public auto ansi FixedPBF
{
.method public instance void .ctor() cil managed
{
}
.method hidebysig public instance void SetRefProperty<class T>(!!T& propertyBackingField, !!T newValue) cil managed
{
.maxstack 2
.locals init ( bool isDifferent, bool CS$4$0000)
ldc.i4.0
stloc.0
ldarg.1
ldobj !!T
ldarg.2
ceq
stloc.1
ldloc.1
brtrue.s L_0001
ldc.i4.1
stloc.0
L_0001: ret
}
}
... если вы сохраните файл Recomp_srp.msil, вы можете просто перекомпилировать его как таковой:
ildasm / dll Recomp_srp.msil
И он работает нормально без бокса на моем конце:
FixedPBF TestFixedPBF = new FixedPBF();
TestFixedPBF.SetRefProperty<string>(ref TestField, "test2");
... конечно, я изменил его с защищенного на общедоступный, вам нужно будет снова внести изменения и предоставить остальную часть вашей реализации.
Я не уверен, почему так происходит бокс. Один из возможных способов избежать бокса - не использовать его. Просто перекомпилируйте без бокса. Пример:.assembly recomp_srp
{
.ver 1:0:0:0
}
.class public auto ansi FixedPBF
{
.method public instance void .ctor() cil managed
{
}
.method hidebysig public instance void SetRefProperty<class T>(!!T& propertyBackingField, !!T newValue) cil managed
{
.maxstack 2
.locals init ( bool isDifferent, bool CS$4$0000)
ldc.i4.0
stloc.0
ldarg.1
ldobj !!T
ldarg.2
ceq
stloc.1
ldloc.1
brtrue.s L_0001
ldc.i4.1
stloc.0
L_0001: ret
}
}
... если вы сохраните файл Recomp_srp.msil, вы можете просто перекомпилировать его как таковой:
ildasm / dll Recomp_srp.msil
И он работает нормально без бокса на моем конце:
FixedPBF TestFixedPBF = new FixedPBF();
TestFixedPBF.SetRefProperty<string>(ref TestField, "test2");
... конечно, я изменил его с защищенного на общедоступный, вам нужно будет снова внести изменения и предоставить остальную часть вашей реализации.
Я считаю, что это сделано специально. Вы не ограничиваете T конкретным классом, поэтому он, скорее всего, преобразует его в объект. Поэтому вы видите, что IL включает бокс.
Я бы попробовал этот код с where T: ActualClass