Мой недавний код включает много упаковка и распаковка, так как многие из моих переменных разрешаются во время выполнения. Но я читал, что упаковка и распаковка очень затратны в вычислительном отношении, поэтому я хочу спросить, есть ли другие способы упаковки/распаковки типов? И это даже хорошая практика, чтобы использовать его?
С# Любые заменители бокса/распаковки?
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
Согласен, дженерики - это путь
- person Rui Jarimba; 22.11.2012
Привет и спасибо за ответ. Однако проблема в том, что я не уверен, какой тип будет возвращать моя функция (в моем коде это либо строка int ИЛИ), и поэтому я не знаю, что будет содержать мой список.
- person Janman; 22.11.2012
@Janman Итак, вы вводите универсальные типы и/или универсальные методы. Например, если у вас сегодня есть класс
SomeClass
, который содержит некоторые переменные, параметры методов и т. д. типа object
, то измените свой класс на SomeClass<T>
, а внутри класса измените object
на T
. Таким образом вы избавитесь от бокса, когда T
будет int
. Детали, конечно, зависят от вашего точного кода, но вы не предоставили пример кода в своем вопросе.
- person Jeppe Stig Nielsen; 22.11.2012
#Jeppe Stig Nielsen Спасибо за ответ. Я обязательно попробую это!
- person Janman; 24.11.2012
В этом конкретном вопросе я мог бы сказать, что используйте более общий тип, в этом случае строку, и проанализируйте ее на число, если это число. Более общий подход заключается в создании пользовательской структуры или использовании кортежа с полем, указывающим, что это реальный ответ для каждого подобного случая, но это довольно уродливо.
person
shanif
schedule
22.11.2012
Передача int в виде строки и ее синтаксический анализ - не хорошее решение. Вы теряете сильные преимущества типизации и перемещаете потенциальные ошибки из времени проектирования/компиляции во время выполнения. Это не рекомендуется. Кроме того, я был бы очень удивлен, если бы синтаксический анализ строки не был намного более затратным в вычислительном отношении, чем упаковка/распаковка, хотя у меня нет статистики, подтверждающей это. (Извините за негативное отношение к новому пользователю)
- person Basic; 22.11.2012