Blog Dla Programistów C#/.NET

wtorek, 26 października 2021
W C# mamy do czynienia z dwoma typami, to znaczy typ wartościowy zwany też typem prostym, a także typem referencyjnym. Konieczne jest zrozumienie, czym tak naprawdę są te typy, jak ich używać i jakie są między nimi różnice. W tym artykule przybliżę Ci ten temat, ponieważ zrozumienie jak działa typ wartościowy i referencyjny, jest bardzo ważne. Koniecznie musisz je poznać, jeżeli chcesz zostać Programistą .NET.

Typ Wartościowy i Typ Referencyjny w C#


Typ wartościowy (prosty)


Typ wartościowy to elementy, które rozszerzają System.ValueType i są to typy proste takie jak na przykład int, long, decimal, double, bool itd.

Są to typy o konkretnie ustalonej wielkości w pamięci. Deklarowanie zmiennej tworzy od razu dla niej miejsce o konkretnej wielkości w pamięci. Przechowywane są one na stosie. Zobacz na taki przykład:

var minNumber = 10;
var maxNumber = 20;
minNumber = maxNumber;
maxNumber = 21;
Console.WriteLine(minNumber);

Console.ReadLine();

Zastanów się teraz przez moment, jaki wynik zostanie wyświetlony na konsoli. Uruchommy aplikacje. Zgodnie z oczekiwaniami zmienna minNumber ma wartość 20. Przypisując wartość zmiennej maxNumber do minNumber, tak naprawdę skopiowaliśmy to, co jest na stosie, czyli wartość. Dlatego, jeżeli w kolejnym kroku została zmieniona wartość zmiennej maxNumber, to i tak zmienna minNumber pozostała bez zmian. Trochę inaczej wygląda taka operacja, gdy działamy na typach referencyjnych.


Typ referencyjny


Typ referencyjny są to elementy dziedziczące po klasie System.Object oraz System.String, czyli głównie klasy, listy, tablice, czy stringi.

Referencja do pamięci umieszczana jest na stosie, ale obszar pamięci, do jakiego prowadzi referencja, znajduje się na stercie. To znaczy, jego wielkość w pamięci nie jest ustalona przy deklaracji. Jest tylko wskazanie na konkretne miejsce. Są usuwane z pamięci za pomocą Garbage Collectora. Rozważmy znowu przykład z kopiowaniem wartości, tym razem w przypadku typów referencyjnych.

var employee1 = new Employee { FirstName = "1" };
var employee2 = new Employee { FirstName = "2" };
employee1 = employee2;
employee2.FirstName = "3";
Console.WriteLine(employee1.FirstName);

Uruchom proszę aplikację i zweryfikuj wynik. Tym razem wynik może nie być dla Ciebie taki oczywisty, ale na ekranie wyświetli się 3.

Jak można zauważyć w przypadku typów referencyjnych, podczas przypisania została skopiowana referencja obiektu i oba obiekty wskazują teraz takie same referencje, czyli wskazują na to samo miejsce w pamięci. Stąd w tym przypadku wyświetla się wynik 3, mimo że wartość właściwości FirstName obiektu employee1 jawnie nie została zmieniona, ale została zmieniona wartość referencji poprzez employee2.


Domyślne wartości


Jeżeli chodzi o wartości domyślne, to w przypadku typów referencyjnych jest to null, a w przypadku typów wartościowych, dla liczb 0, dla bool'a false.

Typy wartościowe mogą również zawierać nulle, ale jeżeli zostaną stworzone jako tzw. typ nullowalny. To znaczy, jeżeli zrobisz taki zapis:

int number = null;

To otrzymasz błąd, ponieważ int nie może być nullem. Jednak jeżeli stworzysz int jako typ nullowalny, to wtedy już możesz przypisać do zmiennej tego typu nulla.

int? number = null;

Tak samo możesz stworzyć typ nullowalny dla bool'a, decimal'a, double'a, long'a i innym typów wartościowych.


PODSUMOWANIE


Tak wygląda typ wartościowy i referencyjny na przykładzie w C#. Możesz spróbować sobie zrobić kilka dodatkowych przykładów związanych z używaniem tych typów, tak aby utrwalić sobie tę wiedzę, ponieważ tak jak wspomniałem na początku, będzie to kluczowe w dalszej nauce programowania.

To wszystko na dzisiaj, do zobaczenia w kolejnym artykule.

Poprzedni artykuł - 16 Popularnych Błędów Początkujących Programistów, Których Musisz Unikać.
Następny artykuł - Czym Jest Typ Domniemany VAR w C#?
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Dodaj komentarz

Wyszukiwarka

© Copyright 2025 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin