Приводит ли передача типа значения в параметре «OUT» переменную?

StackOverflow https://stackoverflow.com/questions/4807086

Вопрос

Я знаю это бокс и распаковка являются относительно дорогими С точки зрения производительности. Мне интересно:

Передает тип значения методу out Параметр Причина бокса/распаковка переменной (и, следовательно, удара по производительности)? Может ли компилятор оптимизировать это?

  int number;
  bool result = Int32.TryParse(value, out number);
Это было полезно?

Решение

Как отмечали другие, здесь нет бокса. Когда вы передаете переменную в качестве аргумента, соответствующего параметру out или ref, вы делаете Создание псевдонима переменной. Анкет Вы ничего не делаете с ценность переменной. Вы делаете две переменные, представляющие одно и то же место хранения.

Бокс происходит только тогда, когда значение типа значения преобразуется в значение эталонного типа, и в вашем примере нет никакого преобразования. Тип ссылки, конечно, должен быть System.Object, System.valueType, System.Enum или любой интерфейс. Обычно это довольно ясно; В коде есть явное или неявное преобразование. Однако могут быть обстоятельства, когда это менее ясны. Например, когда называется непревзойденным виртуальным методом базового типа структуры, есть бокс. (Существуют также странные ситуации, в которых определенные виды ограничений общего типа могут вызвать неожиданный бокс, но они обычно не возникают на практике.)

Другие советы

Нет бокса, компилятор использует инструкцию LDLOCA.S, которая нажимает на локальную переменную на стек (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldloca_s(vs. 71) .aspx)

.method private hidebysig static void Func() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 num,
        [1] bool flag)
    L_0000: nop 
    L_0001: ldstr "5"
    L_0006: ldloca.s num
    L_0008: call bool [mscorlib]System.Int32::TryParse(string, int32&)
    L_000d: stloc.1 
    L_000e: ret 
}

Нет, нет бокса (требуется/вовлечен).

Когда вы делаете вариант, изменения в штучной экземпляре не влияют на оригинал. Но это именно то, что out должен делать.

Компилятор «каким -то образом» создает ссылку на исходную переменную.

Нет бокса; что за out Параметр делает указано, что число должно быть назначено в пределах TryParse метод Независимо от этого, он все еще рассматривается как int, не object.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top