Strona główna » Kursy » Kurs C# » Pusta Zmienna
 

Pusta Zmienna

Wstęp

Zmienna to w pewnym sensie pudełko do którego można wrzucać rzeczy określonego typu. Co jednak, gdy zmienna nie zostanie przypisana żadna wartość? Otóż będzie, tak jak pudełko, pusta. Jednak jaką ma w takim razie wartość? Przykładowo dla liczb możnaby przyjąć, że 0 oznacza wartość pustą, ale co kiedy 0 jest też poprawną wartością argumentu? W takim przypadku warto skorzystać z zmiennej, która pozwala sprawdzić czy wartość nie jest pusta.

Deklaracja

Deklarowanie zmiennej typu pustego w języku C# polega na utworzeniu obiektu Nullable opartego na jakimś innym typie danych. Przykładowo jeśli chcemy utworzyć zmienną typu int, która może być pusta należy wpisać:

  1. Nullable<int> liczba;

Istnieje jednak o wiele prostsza metoda deklaracji takiego typu, która polega na dodaniu na końcu wybranego typu zmiennej znaku zapytania. W ten sposób uzyskuje się przejrzysty kod programu:

  1. char? znak;

Nie można zadeklarować pustego typu zmiennej dla typów, które już mogą przyjmować pustą wartość null. Dotyczy to między innymi typu string.

Użycie

Wartość pustą można przypisać poprzez słowo specjalne null.

  1. liczba = null;

Tego typu wartość symbolizuje, że do danej zmiennej nie została przypisana żadna wartość. Oznacza to, że pudełko jest puste i nie posiada jakiejkolwiek wartości. W przypadku próby wypisania zmiennej o takiej wartości na konsolę nie zostanie wypisane cokolwiek.

  1.  

Przykładowo na zmiennej typu int, która może przyjmować wartość pustą można wykonywać operację arytmetyczne. Nie zmieni to jednak jej wartości i po każdej operacji wynik będzie pusty. Wyjątkiem jest przypisanie zmiennej konkretnej wartości liczbowej.

Poniżej został zamieszczony kod oraz co zostanie wypisane na konsole.

  1. Console.WriteLine("[1] {0}", liczba);
  2. liczba += 12;
  3. Console.WriteLine("[2] {0}", liczba);
  4. liczba = 1234;
  5. Console.WriteLine("[3] {0}", liczba);
  6. liczba += 12;
  7. Console.WriteLine("[4] {0}", liczba);
  1. [1]
  2. [2]
  3. [3] 1234
  4. [4] 1246

Czy puste?

Zmienne rozszerzone o wartość pustą posiadają właściwość HasValue, która zwraca wartość logiczną czy dana zmienna posiada jakąkolwiek wartość tj. czy nie jest pusta. Jest to równoważne z zaprzeczeniem wyniku porównania zmiennej i wartości null. Przykładowo można to wykorzystać do wypisania użytkownikowi informacji o zmiennej:

  1. znak = null;
  2. Console.WriteLine("ma wartość? {0}", znak.HasValue ? "Tak" : "Nie");
  3. znak = 'A';
  4. Console.WriteLine("ma wartość? {0}", znak.HasValue ? "Tak" : "Nie");
  1. Nie
  2. Tak

Domyślna wartość

Jednak co jeśli algorytm potrzebuje konkretnej wartości liczbowej, a zmienna nie ma wartości? Jeśli piszemy algorytm, który sumuje elementy listy to możemy przyjąć, że jeśli wystąpi pusta wartość to symbolizuje ona wartość 0, ale w przypadku, gdybyśmy chcieli elementy listy przez siebie pomnożyć to potrzebowaliśmy wartości 1. Jak widać pusta wartość liczby może być interpretowana na wiele różnych sposobów. Z tego powodu zmiennej nie można przypisać domyślnej wartości, ale można określić co powinno zostać zwrócone, gdy jest pusta w momencie pobierania wartości.

Metoda GetValueOrDefault() przyjmuje jeden argument, który zostanie zwrócony jeśli zmienna jest pusta. Przykładowo w poniższym kodzie do zmiennej a zostanie przypisana wartość 0 wtedy, gdy zmienna liczba jest pusta:

  1. Console.WriteLine("a = {0}", liczba.GetValueOrDefault(0));

Nazwa metody jest do zapamiętania, ale jest długa, daltego warto pamiętać o operatorze podwójnego znaku zapytania ??, który pozwala na skrócenie przedstawionej wyżej metody.

  1. Console.WriteLine("a = {0}", liczba ?? 0);

Domyślna wartość

Puste zmienne są bardzo przydatne, gdy nie ma pewności, że wszystkie zmienne będą cały czas określone. Należy ich jednak używać bardzo ostrożnie, ponieważ nie dają one jednak żadnych ostrzeżeń o wyjątku w programie, ponieważ zmienna nie posiada żadnej wartości. W rezultacie po skompilowaniu program będzie zwracał niepoprawne wyniki i będzie bardzo ciężko wykryć w którym miejscu zmienna ma nieodpowiednią wartość.

Zadania

Zadanie 1

Napisz funkcję sumujListe(), która będzie przechowywać zmienne typu int?. W przypadku natrafienia na wartość pustą powinna ona zostać potraktowana jako 0. Przykładowo dla tablicy danych [1, 2, null, 3] program powinien zwrócić 6. Przetestuj działanie napisanej funkcji.