Implementovat si "standardní" kolekce sám z jiných než čistě akademických důvodů velmi nedoporučuji. Nejenom, že je to zbytečně, ale hlavně neuděláte stejně dobrou práci jako již udělal Microsoft. I kdyby jste měl implementaci dobře, podložíte její správnost a obecnost kompletními unit testy? Budete kolekci optimalizovat nejenom z hlediska časové náročnosti jednotlivých operací, ale i hlediska paměťové náročnosti, počtu nutných alokací, zátěže na GC apod.? (standardní implementace má například enumerátor řešen jako struct apod.) Co udělat můžete, a běžně se to dělá, je to, že pokud např. potřebujeme vlastní kolekci, která na rozdíl od té obecné něco schválně např. neumožňuje, má jíný interface, nebo má nějak jinak pozměněnou sémantiku některých operací, tak jí naimplementujete jako vlastní třídu, která bude ale standardní kolekci využívat interně (skládáním objektů). Nicméně pokud si čistě z akademických důvodů přece jenom chcete zkusit naimplementovat např. obecný list, tak standardní List<T> je interně implementován (velmi zjednodušeně) jako wrapper nad polem s tím, že pokud při přidávání prvku není pro nový prvek v aktuálně alokovaném poli již místo, tak se vždy naalokuje pole nové o dvojnásobné velikosti (kapacitě), hodnoty z původního pole se do něho překopírují a ve wrapperu se začne držet reference na toto nové pole (takže původní pole GC odstraní). Prvotní velikosti pole lze uvést v konstruktoru (varianta s parametrem capacity) nebo je 4. Podívejte se přímo do referenčního zdrojového kódu .NET Frameworku na webu: http://referencesource.microsoft.com/#ms...,cf7f4095e4de7646 nebo použijte nástroje jako .NET Reflector, dotPeek a podobné.
|