Я бы порекомендовал вам 2 хорошие статьи Эрика Липперта.
http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx
Вот цитата, с которой я согласен на 100%
Использование стека для локальных переменных типа значения — это просто оптимизация, которую CLR выполняет от вашего имени. Важной особенностью типов значений является то, что они имеют семантику копирования по значению, а не то, что иногда их освобождение может быть оптимизировано средой выполнения.
В 99% приложений разработчиков не должно волновать, почему типы Value находятся в стеке, а не в куче, и какой прирост производительности здесь может быть. Ютс имеет в виду очень простые правила:
- Избегайте упаковки/распаковки, когда в этом нет необходимости, используйте коллекции дженериков. Большинство проблем возникает не тогда, когда вы определяете свои собственные типы, а когда вы неправильно используете существующие типы (определенные Microsoft или вашими коллегами).
- Сделайте ваши типы значений простыми. Если вам нужна структура с 10-20 полями, я полагаю, вам лучше создать класс. Представьте себе, все эти поля будут копироваться каждый раз, когда вы изредка будете передавать ей функцию по значению...
- Я не думаю, что очень полезно иметь типы значений с полями ссылочного типа внутри. Подобно структуре со строковыми и объектными полями.
- Определите, какой тип вам нужен, в зависимости от требуемой функциональности, а не от того, где он должен храниться. Структуры имеют ограниченную функциональность по сравнению с классами, поэтому, если структура не может предоставить требуемую функциональность, например конструктор по умолчанию, определите класс.
- Если что-то может выполнять какие-либо действия с данными других типов, оно обычно определяется как класс. Для структур операции с разными типами следует определять только в том случае, если вы можете привести один тип к другому. Скажем, вы можете добавить int к double, потому что вы можете привести in к double.
- Если что-то должно быть без состояния, это класс.
- Когда вы колеблетесь, используйте ссылочные типы. :-)
Любые правила допускают исключения в особых случаях, но не пытайтесь чрезмерно оптимизировать.
p.s. Я встречал некоторых разработчиков ASP.NET с 2-3-летним опытом, которые не знают разницы между стеком и кучей. :-( Я бы не нанял такого человека, если бы я был интервьюером, но не потому, что упаковка/распаковка может быть узким местом на любом из сайтов ASP.NET, которые я когда-либо видел.
person
Bogdan_Ch
schedule
22.06.2009