niedziela, 07 maja 2017

Krotki

Krotka (od "krotność"), czyli klasa Tuple, nie jest właściwie kolekcją. Jej strukturę tworzy ściśle określona liczba elementów. Liczba reprezentowanych przez nią elementów jest częścią jej typu. Dlatego też krotka dwuelementowa jest czymś innym niż trójelementowa. Dodatkowo, każdy element może być różnego typu, przez co krotka dwuelementowa przechowująca int oraz string jest czymś innym niż krotka przechowująca double oraz int. Co więcej, ważna jest również kolejność elementów, przez co krotka int oraz string różni się od krotki string oraz int.

var people = new Tuple("Jerry Smith", 1988, new[] { 2011, 2015 });

Zapewne niektórzy z Was pukają się w czoło, myśląc: "To samo można osiągnąć, definiując własny typ danych". Tak, to prawda, natomiast zastosowanie krotek pozwala na zaoszczędzenie czasu.Krotki zapewniają wbudowany odpowiednik metody GetHashCode oraz Equals, zwracający prawdę, o ile wszystkie elementy porównywanych krotek są identyczne. .NET Framework udostępnia krotki zawierające od jednego Tuple do ośmiu Tuple elementów.Deklarowanie krotki składającej się z ośmiu typów, gdzie konieczne jest określenie każdego z typów, jest mało wygodne.Problem rozwiązuje metoda Create statycznej klasy Tuple, automatycznie określająca typy na podstawie przekazanych elementów.Prezentuje to przykład poniżej.

var people = Tuple.Create("Jerry Smith", 1988, new[] { 2011, 2015 });

Wartości Item1, Item2 itd. udostępnione przez krotki ograniczają się wyłącznie do odczytu.Język C# nie umożliwia nazwania poszczególnych wartości, tak jak ma to miejsce w innych językach programowania.

var people = Tuple.Create("Jerry Smith", 1988, new[] { 2011, 2015 });
        Console.WriteLine(people.Item1);
Console.WriteLine(people.Item2); 
Console.WriteLine(string.Join(", ", people.Item3));

Krotki najczęściej stosowane są w miejscach, gdzie potrzebujemy zwrócić lub przekazać kilka wartości bez potrzeby korzystania z konkretnego typu wewnątrz własnego kodu.Oczywiście wszędzie tam, gdzie udostępniamy kod, zwracanie wyniku za pomocą krotek jest mało eleganckie.Z punktu wydajnościowego, stosowanie istniejących typów jest szybsze niż generowanie nowych anonimowych typów.

Troska Robert