Funkce .Count ve vlasní třídě VB 2010   zodpovězená otázka

VB.NET

Zdravím,

mohl by mi prosím někdo poradit, jak by zhruba měla vypadat třída, která má tyto vlastnosti i metody:


MyClass.Add(10)
MyClass.Add(11)
MyClass.Add(12)

Dim x as Integer 
x = MyClass.Items.Count
x = MyClass.Item(0)
MyClass.Items.Clear
MyClass.Items.RemoveAt(1)
 

Chtěl si udělat buffer pro data typu byte. Něco jako halda. Takže asi pole typu byte a pak některá další proměnné, které budou hlídat stav bufferu. Vlastnosti a metody bych tam chtěl podobné jako má třeba objekt ListBox.

Podruhé jsem si teď přečetl "seriál vb.net od začátku" od Tomáše Hercega, ale nějak jsem tyto náročnější struktury nenašel vysvětlené.

Díky Fano.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

.NET má několik různých kolekcí (List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T> (fronta), Stack<T> (zásobník) atd.) viz:

http://msdn.microsoft.com/en-us/library/...

Pokud Vám stačí kolekce s přístupem pomoci indexu, tak to je List<T>:

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, to je to co bych potřeboval, ale rád bych si podobnou kolekci vytvořil sám, abych si jí pak mohl upravovat podle libosti. Šlo by zjistit jak je sestavena kolekce třeba jako je List<T> nebo Stack<T>? Nebo je někde popis jak si podobnou kolekci sestavit? Nebo nějaký example?

Tvořit třídy s metodami a vlastnostmi už docela umím tak teď už jen stačí přidat vlastní jednoduchou kolekci pohrát si s přepisováním a myslím že už nejsem daleko od cíle. :-)

Dík Fano.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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é.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuju, to byla super vyčerpávající odpověď. Myslím, že zkusím na-implementovat obecnou kolekci do svojí kolekce a tím budu omezovat přístup.

Ještě jednou díky za rady.

Fano...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback