niedziela, 8 listopada 2015

pytania rekrutacyjne C#/.NET - podstawy

W dzisiejszym wpisie zmierzę się z podstawowym pytaniem na większości rozmów rekrutacyjnych dla programistów C#/.NET, a mianowicie: "jakie są podstawowy typy danych?" lub "jaka jest różnica między typem wartościowym i referencyjnym?". Słyszałem jeszcze kilka innych wariacji, ale skupmy się na samym zagadnieniu.

Wyróżniamy następujące 2 podstawowe typy:
- wartościowe (value types)
- referencyjne (reference types)

Ponadto, o czym mało osób wie, C# wspiera wskaźniki, takie jak znane z C++. Żeby wykorzystywać wskaźniki, należy spełnić 2 warunki: włączyć we właściwościach projektu "Allow unsafe code" oraz każde użycie kodu że wskaźnikami umieścić w bloku unsafe.

Typy wartościowe przechowujemy na stosie (stack), a typy referencyjne na stercie (heap). Tutaj należałoby powiedzieć coś więcej na temat zarządzania pamięcią w .NET, ale to będzie przedmiotem osobnego posta. Jednakże warto wspomnieć o tym czym jest stos, gdyż wiele osób o tym nie wie - stos to kolejka typu LIFO (Last In - First Out). Oznacza to, że jeśli włożymy 3 elementy na stos, to żeby otrzymać pierwszy, musimy zdjąć ze stosu pozostałe 2 elementy, co jest kosztowne (zarówno czas jak i pamięć).

W przypadku typów wartościowych (np. int, bool, struct itd.) po przypisaniu wartości do zmiennej, a następnie przekazaniu zmiennej do metody, jej wartość nie ulegnie modyfikacji z wyłączeniem przekazania zmiennej z modyfikatorem ref lub out. Dotyczy to również typów referencyjnych oznaczonych jako immutable (opis w następnym poście).

Natomiast w przypadku typów referencyjnych (każda klasa z wyłączeniem immutable) przekazujemy referencję do obiektu (porównując do C++: kopię wskaźnika do obiektu). W związku z czym modyfikując jakąś właściwość czy pole znajdujące się w klasie, odwołując się do takiego obiektu z poziomu innej klasy, modyfikacja będzie widoczna i "trwała".

Brak komentarzy:

Prześlij komentarz