.NET Framework 4.0 není jen inkrementálním updatem, jakým byly .NET Framework 3.0 a 3.5, ale úplně novou verzí (podobně jako například verze 1.1 vs. 2.0). Ani jazyk C# (či VB.NET) nezůstává pozadu a přidává další nové vlastnosti (nicméně i C# verze 3.0 přišel s nemalým množstvím změn).
reklama
.NET Framework 4.0 není jen inkrementálním updatem, jakým byly .NET Framework 3.0 a 3.5, ale úplně novou verzí (podobně jako například verze 1.1 vs. 2.0). Ani jazyk C# (či VB.NET) nezůstává pozadu a přidává další nové vlastnosti (nicméně i C# verze 3.0 přišel s nemalým množstvím změn).
Dnes se podíváme na jednu z datových struktur známou především z funkcionálních jazyků (mimo jiné vznik tohoto typu byl také inspirován lepší spoluprácí s funkcionálními jazyky jako např. F#). Jedná se o n-tici neboli Tuple. Tuple není nic jiného než kontejner pro několik hodnot (konečný počet). Jedná se o referenční typ, avšak při návrhu se uvažovalo i o reprezentaci jako typ hodnotový. Samozřejmě n-tice plně využívají výhod generických typů.
V základu .NET Framework nabízí osm předpřipravených tříd. Můžete tedy „bez práce“ uložit osm resp. sedm hodnot. Například:
Tuple<int, string, int> t = new Tuple(1, "1", 1);
Je možné použít též factory metodu na abstraktní třídě Tuple:
Tuple<int, string, int> t = Tuple.Create(1, "1", 1);
Možná vás napadlo, co budete dělat v případě, že potřebujete uložit více než osm resp. sedm prvků. Inu, využijete poslední, osmý, prvek (pojmenovaný Rest) a do něj uložíte další n-tici. Avšak nic vám nebrání oddědit si vlastní implementaci, pokud často např. 12 prvků využíváte.
Tuple<int, int, int, int, int, int, int, Tuple<int, int, int, int, int>> tuple12 = new Tuple<int, int, int, int, int, int, int, Tuple<int, int, int, int, int>>(1, 2, 3, 4, 5, 6, 7, new Tuple<int, int, int, int, int>(8, 9, 10, 11, 12));
Pokud vytvoříte Tuple<T1, T2> nápadně se podobá typu KeyValuePair<TKey, TValue>, ale nejde o přímá „synonyma“. KeyValuePair dává prvkům význam v podobě klíč-hodnota, leč Tuple nikoli. Bere je jako dva nezávislé prvky, bez dalšího významu.
Jak jistě dokážete domyslet, můžete pomocí n-tic reprezentovat v zásadě libovolné pojmenované typy. Vždyť některé jazyky jsou na n-ticích postaveny. Nicméně C# nepřináší žádnou podporu v podobě jazykového konstruktu pro využívání n-tic.
N-tice představují také obrovské pokušení pro programátory a jejich nadměrné používání může vést k nepřehlednému kódu. Tuple nedává žádnému prvku jméno nebo význam, takže ačkoli pro předání pár hodnot se použití může zdát jako dobrý nápad, později se může vymstít. Nebude jasné, co která hodnota představuje a případně kde jakou hodnotu hledat. Doporučuji proto v případě sebemenších pohybností raději vytvořit triviální třídu a prvky jasně pojmenovat. Mimo jiné tím i máte pojmenovaný typ, který přehlednost dále zlepšuje.
Myslíte si, že zavedení datového typu Tuple je dobrý nápad? Podělte se o názory v diskuzi.