Бокс/распаковка происходит, когда тип значения (например, struct, int, long) передается где-то, который принимает ссылочный тип - например, object
.
Это происходит, когда вы явно создаете метод, который принимает параметры объекта типа, которые будут переданы типам значений. Он также появляется, когда вы используете старые не общие коллекции для хранения типов значений (обычно примитивов).
Вы также увидите бокс, когда используете String.Format()
и передаете ему примитивы. Это связано с тем, что String.Format()
принимает объект params [], что приводит к боксу дополнительных параметров в вызове.
Использование методов отражения для вызова также может привести к боксу/распаковке, поскольку API-интерфейсы отражения не имеют иного выбора, кроме как вернуть object
, поскольку реальный тип неизвестен во время компиляции (а API-интерфейсы Reflection не могут быть общими).
Новые общие коллекции не приводят к боксу/распаковке, поэтому поэтому предпочтительнее старых коллекций по этой причине (например, ArrayList, Hashtable и т. Д.). Не говоря уже о том, что они типичны.
Вы можете избежать проблем с боксами, изменив методы, которые принимают общие объекты. Например:
public void string Decorate(object a) // passing a value type results in boxing
{
return a.ToString() + " Some other value";
}
против:
public void string Decorate<T>(T a)
{
return a.ToString() + " some other value";
}
Я согласен с тобой. Из всего, что я читал по этому вопросу, я просто не понимаю. Должно быть, что-то не хватает :) –