Почему делает общий метод с ограничением T: результат класса в упаковке? [дубликат]

Можно поместить обе настройки в machine.config, и затем они доступны для всего Вы приложения на сервере.

12
задан Cœur 30 May 2018 в 16:30
поделиться

3 ответа

Вам не нужно беспокоиться о каком-либо снижении производительности из-за инструкции блока , потому что, если его аргумент является ссылочным типом, инструкция box ничего не делает. Хотя все еще странно, что инструкция box даже была создана (может быть, лень / упрощенный дизайн при генерации кода?).

2
ответ дан 2 December 2019 в 23:51
поделиться

Я не уверен почему возникает бокс. Один из возможных способов избежать бокса - не использовать его. Просто перекомпилируйте без бокса. Пример:

.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");

... конечно, я изменил его с защищенного на общедоступный, вам нужно будет снова внести изменения и предоставить остальную часть вашей реализации.

1
ответ дан 2 December 2019 в 23:51
поделиться

Я считаю, что это сделано специально. Вы не ограничиваете T конкретным классом, поэтому он, скорее всего, преобразует его в объект. Поэтому вы видите, что IL включает бокс.

Я бы попробовал этот код с where T: ActualClass

0
ответ дан 2 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: