С# Любые заменители бокса/распаковки?

Мой недавний код включает много упаковка и распаковка, так как многие из моих переменных разрешаются во время выполнения. Но я читал, что упаковка и распаковка очень затратны в вычислительном отношении, поэтому я хочу спросить, есть ли другие способы упаковки/распаковки типов? И это даже хорошая практика, чтобы использовать его?


person Janman    schedule 22.11.2012    source источник
comment
У вас проблемы с производительностью? Пробовали ли вы профилировать свое приложение, чтобы увидеть, есть ли в нем узкие места? Сначала сконцентрируйтесь на известных узких местах, прежде чем беспокоиться о чем-то, что может вообще не быть проблемой.   -  person Polyfun    schedule 22.11.2012
comment
#ShellShock Я не думаю, что производительность является проблемой в моей программе, но я думаю, что это довольно интересная проблема, и это также может помочь другим пользователям.   -  person Janman    schedule 22.11.2012


Ответы (2)


Используйте 1_....

Подробнее здесь


Например

List lst=new List();//non generic List accepts any kind of object
lst.Add(44);//this causes unnecessary boxing from int to object
lst.Add(100);//this causes unnecessary boxing from int to object

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

List<int> lst=new List<int>();
lst.Add(44);//no boxing or unboxing
lst.Add(100);//no boxing or unboxing
person Anirudha    schedule 22.11.2012
comment
Согласен, дженерики - это путь - person Rui Jarimba; 22.11.2012
comment
Привет и спасибо за ответ. Однако проблема в том, что я не уверен, какой тип будет возвращать моя функция (в моем коде это либо строка int ИЛИ), и поэтому я не знаю, что будет содержать мой список. - person Janman; 22.11.2012
comment
@Janman Итак, вы вводите универсальные типы и/или универсальные методы. Например, если у вас сегодня есть класс SomeClass, который содержит некоторые переменные, параметры методов и т. д. типа object, то измените свой класс на SomeClass<T>, а внутри класса измените object на T. Таким образом вы избавитесь от бокса, когда T будет int. Детали, конечно, зависят от вашего точного кода, но вы не предоставили пример кода в своем вопросе. - person Jeppe Stig Nielsen; 22.11.2012
comment
#Jeppe Stig Nielsen Спасибо за ответ. Я обязательно попробую это! - person Janman; 24.11.2012

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

person shanif    schedule 22.11.2012
comment
Передача int в виде строки и ее синтаксический анализ - не хорошее решение. Вы теряете сильные преимущества типизации и перемещаете потенциальные ошибки из времени проектирования/компиляции во время выполнения. Это не рекомендуется. Кроме того, я был бы очень удивлен, если бы синтаксический анализ строки не был намного более затратным в вычислительном отношении, чем упаковка/распаковка, хотя у меня нет статистики, подтверждающей это. (Извините за негативное отношение к новому пользователю) - person Basic; 22.11.2012