Упаковка / распаковка происходит, когда тип значения (например, struct, int, long) передается где-то, который принимает ссылочный тип - например, object
.
Это происходит, когда вы явно создаете метод, который принимает параметры типа объекта, которому будут переданы значения типов. Он также появляется, когда вы используете старые неуниверсальные коллекции для хранения типов значений (обычно примитивов).
Вы также увидите бокс при использовании String.Format()
и передаче ему примитивов. Это связано с тем, что String.Format()
принимает объект params [], что приводит к упаковке дополнительных параметров в вызове.
Использование отражения для вызова методов также может привести к упаковке / распаковке, потому что у API отражения нет иного выбора, кроме как возвращать object
, так как реальный тип не известен во время компиляции (а API отражения не может быть универсальным).
Более новые универсальные коллекции не приводят к упаковке / распаковке и поэтому предпочтительнее старых коллекций по этой причине (например, 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";
}