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