Typy object i dynamic w C#
Typ object
Istnieje specjalny typ o nazwie object, który może przechowywać dowolny typ danych. Ta elastyczność okupiona jest jednak mniej czytelnym kodem i zmniejszoną wydajnością programów, wynikającą z konieczności wykonania operacji zapakowania (ang. boxing) i rozpakowania (ang. unboxing) podczas zapisywania i odczytywania wartości. Z tego powodu należy unikać jej stosowania, jeżeli to tylko możliwe.
Utwórz nowy projekt aplikacji konsoli, nazwij go Zmienne, a następnie wpisz do metody Main poniższy kod:
object imie = "Piotr"; // zapisanie wartości typu string w zmiennej typu object
int dlugosc1 = imie.Length; // powoduje błąd kompilacji!
int dlugosc2 = ((string)imie).Length; // rzutowanie daje dostęp do elementów obiektu
Typ object był dostępny już od pierwszych wersji języka C#, ale dopiero C# 2 i nowsze wersje wprowadziły znacznie lepszą alternatywę w postaci typów generycznych, o których będziemy mówić później. Typy te dają nam dużą elastyczność w pracy z danymi bez dodatkowych narzutów zmniejszających wydajność programu.
Typ dynamic
Istnieje jeszcze jeden specjalny typ danych o nazwie dynamic, który również pozwala na zapisanie dowolnego typu danych. Podobnie jak w przypadku typu object, ta elastyczność okupiona jest zmniejszeniem wydajności programu. Jednak w przeciwieństwie do typu object, tutaj mamy bezpośredni dostęp do elementów wartości zapisanej w zmiennej, bez konieczności wykonywania jawnego rzutowania, tak jak w poniższym kodzie:
dynamic inneImie = "Paweł";
// tę instrukcję można skompilować, ale może ona powodować błędy w czasie pracy programu!
int dlugosc = inneImie.Length;
Ograniczeniem typu dynamic jest to, że Visual Studio nie jest w stanie pokazać podpowiedzi IntelliSense wspomagających pisanie kodu, ponieważ kompilator nie sprawdza zmiennych tego typu podczas kompilacji. Takimi kontrolami zajmuje się środowisko CLR w czasie wykonywania programu. Słowo kluczowe dynamic zostało wprowadzone w języku C# 4.