Strona główna » Kursy » Kurs C# » Typ Anonimowy
 

Typ Anonimowy

Wstęp

Typ Anonimowy pozwala na bardzo szybkie tworzenie zmiennych, które mogą przechowywać wartości pod pewnymi określonymi wartościami. Ich zaletą jest bardzo prosta implementacja i elastyczność zastosowania. W tym artykule zostanie wyjaśnione jak taki typ zadeklarować i użyć.

Podstawowe zagadnienia

Deklaracja

Typ anonimowy można rozpoznać po typie użytym do deklaracji var, a jako przypisaną wartość pisze się słowo kluczowe new i w nawiasach klamrowych pary w formacie "nazwa = wartość" rozdzielając dane przecinkiem. Przykładowo chcąc zadeklarować zmienną przechowującą wartości A i B należy wpisać:

  1. var zmienna1 = new { A = 1, B = 2 };

Jeśli chodzi o typ zmiennej nic nie stoi na przeszkodzie, aby zamiast liczby całkowitej podać jakiś tekst, albo znak. Należy jednak pamiętać, że każda wartość musi mieć podaną nazwę (tj. w poprzednim przykładzie A). Przykładowo:

  1. var zmienna2 = new { tekst = "Cześć!", znak = 'C' };

Uwaga! Typu anonimowego nie można zwrócić jako wynik działania funkcji. Wtedy należy zastosować krotkę (Tuple).

Wypisywanie danych

Typ anonimowy pozwala na dostęp do wybranej właściwości poprzez operator kropki ".". Przykładowo, aby odczytać zapisany wcześniej tekst w zmiennej należy wpisać:

  1. Console.WriteLine(zmienna2.tekst);

Jeśli jednak istnieje potrzeba, aby wypisać wszystkie dane, które znajdują się w zmiennej to nie trzeba wypisywać każdej wartości oddzielnie. Typ anonimowy ma wbudowany konwerter zmiennej do tekstu. Dane są wypisywane w takim samym formacie jak podczas deklaracji, ale wartości są wypisane jako wartości, a nie jak muszą zostać zadeklarowane. Czyli np. tekst będzie wypisany bez cudzysłowia:

  1. Console.WriteLine(zmienna2);

Zamiana wartości

Typ anonimowy nie pozwala na zmianę wartości. Chcąc zmienić trzeba zadeklarować go jeszcze raz podając nowe wartości. Jednak w tym miejscu należy postępować bardzo ostrożnie, ponieważ bardzo łatwo pomylić się w kodzie. Podczas ponownej deklaracji należy podać wszystkie nazwy kolejnych parametrów - o ile ich kolejność nie ma znaczenia to w dalszej części kodu może zabraknąć pewnej właściwości.

  1. // BŁĄD
  2. // zmienna2.tekst = "Inny tekst";
  3. var zmienna3 = new { tekst = "Inny tekst", znak = zmienna2.znak };

Inna deklaracja

W typie anonimowym można pominąć nazwy parametrów pod warunkiem, że wartości są podawane poprzez inne zmienne. Wtedy kompilator automatycznie nazwie parametry tak jak nazywają się zmienne. Tą sztuczkę można zastosować podczas zwracania wielu argumentów z funkcji - wystarczy po prostu podać co się chce zwrócić.

  1. int a = 3;
  2. int b = 2;
  3. var zmienna4 = new { a, b };
  4. Console.WriteLine(zmienna4);

Wypisując zadeklarowaną w ten sposób zmienną otrzymujemy:

  1. { a = 3, b = 2 }

Zastosowanie

Podczas jednego przejścia tablicy zostaną wyznaczone wartości maksimum, minimum oraz średnia. Na koniec działania kodu zostaną spakowane do zmiennej typu anonimowego, a następnie wypisane. Oczywiście możliwe jest dopisanie dalszego kodu, który wykorzysta zgromadzone informacje.

  1. int[] dane = { 1, 5, 3, 2, 4 };
  2. int max = dane[0], min = dane[0];
  3. double średnia = dane[0];
  4. for (int i = 1; i < dane.Length; i++) {
  5.   if (dane[i] > max) {
  6.     max = dane[i];
  7.   }
  8.   else if (dane[i] < min) {
  9.     min = dane[i];
  10.   }
  11.   średnia += dane[i];
  12. }
  13. średnia /= dane.Length;
  14. var podsumowanie = new { max, min, średnia };
  15. Console.WriteLine(podsumowanie);

Podsumowanie

Typ anonimowy jest bardzo wygodny, ponieważ deklaracja jest przejrzysta, a podczas odczytywania danych środowisko samo podpowiada jakie parametry ma ustalone dany obiekt. Niewątpliwie ograniczeniem jest fakt, że zapisanych danych nie można edytować, ani zwrócić jako wynik diałania funkcji. Jednak sprawdza się jako szybkie grupowanie wielu zmiennych.

Zadania

Zadanie 1

Napisz kod, który użyje typu anonimowego do szybkiego wypisania tekstu, którego wielkość znaków a) nie zostanie zmieniona, b) wszystkie znaki będą małe oraz c) wszystkie znaki będą duże. Przykładowo dla tekstu "Tekst" wypisze na ekran:

  1. { wprowadzony = Tekst, maleZnaki = tekst, duzeZnaki = TEKST }