По моему личному мнению, попытка угадать собственное управление памятью в .Net не является практикой, которую я бы рекомендовал. Вы просто не можете контролировать уровень распределения памяти, который вы можете использовать в нативном сценарии, но в равной степени вам это не нужно. Я был одержим желанием сделать это, когда я впервые перешел с C ++ (где я буду регулярно работать со своими собственными кучами и писать подпрограммы локализации памяти и т. Д.), Но быстро стало очевидно, что мне просто не нужно, ни может я.
Например, у вас может быть массив MyPooledObject
в нижней части вашего дерева, но, если это ссылочный тип, то у вас просто есть массив ссылок, где фактическая память для каждого где-то где-то иначе - то, что вы не можете контролировать (если вы не адаптируете свой собственный хост для среды выполнения).
Это оставляет использование типа значения вместо этого - но они просто не подходят для использования в объединенном сценарии, потому что пользовательские типы значений должны быть неизменяемыми (я могу сказать, что безопасно, не оправдывая это - просто Google 'immutable' и 'struct 'targetting site: stackoverflow.com, чтобы увидеть больше) и, следовательно, нет смысла рассматривать как объекты многократного использования.
Если вам нужна индексируемая коллекция объектов в .Net, где каждый из них можно узнать по ключу с хэш-поддержкой, используйте словарь.
Если у вас слишком много объектов, чтобы поместиться в памяти, то либо:
1) Получите больше памяти
2) Использовать базу данных и кэшировать ее локальные сегменты
Или и то, и другое: вы можете рассмотреть AppFabric и его функции кэширования , чтобы вы могли создать ферму машин, предназначенных для запуска в кэш-памяти миллионов объектов. Стоимость оборудования, вероятно, будет меньше, чем стоимость разработки собственного решения для управления памятью для .Net:)