Typowania - porównanie typowań domniemanych, statycznych i dynamicznych: “dynamic”, “var”, “object”

ASP NET MVC i C#
typowanie dynamiczne statyczne var lodka woda rzeka jezioro

Standardowo w C# występuje silne typowanie, kiedy danemu elementowi przypisywany jest typ, a pamięć dla niego jest w tym momencie rezerwowana. Takie statyczne typy są kompilowane poprzez środowisko uruchomieniowe CLR (Common Language Runtime). C# 4.0 wprowadził nowy sposób typowania - dynamiczny. Typy dynamiczne są omijane przez kompilator CLR, przechwytywane przez środowisko uruchomieniowe DLR (Dynamic Language Runtime) i obsługiwane w czasie działania programu. DLR jest częścią CLR, powstało aby umożliwić współpracę z dynamicznymi językami.

W języka dynamicznie typowanych, takich jak PHP. Python lub Ruby typ jest sprawdzane w czasie działania aplikacji (zależy prostu od typu wartości, którą się przypisuje) natomiast w ściśle typowanym C# typ musi być znany już na etapie kompilacji.

“Dynamic” potrafi ominąć problem ścisłego typowania, lecz wiążą się z tym duże problemy wydajnościowe oraz związane z analizą kodu.

Przykład użycia dynamic:

dynamic d = 13;

//teraz zmienna “d” jest typu Int32

d = "sth";

//teraz zmienna “d” jest typu string
//próba wykonania działania matematycznego zwróci błąd:

d++;

Jednak ten błąd będzie wychwycony dopiero w trakcie działania programu a nie w czasie pisania kodu w edytorze.

Ciekawą własnością jest to, że definiowanie typów za pomocą “var” i “object” również pozwala na przypisywanie różnych typów.

“Var” pozwala na domniemanie typu. Tak naprawdę “var” tylko ukrywa (upraszcza kod) prawdziwy typ. jeśli do “var” zostanie przypisany jakiś typ, na przykład Int32 to nie będzie możliwości zmiany typu w trakcie działania aplikacji.

Typ “object” jest typem po którym dziedziczą wszystkie inne typy więc pozwala na przypisanie zmiennych dowolnych typów. Podczas działań na zmiennej typu “object” konieczne jest jednak wykonanie rzutowania na odpowiedni typ.

Jakie są różnice między typem “dynamic” i “object”?

W przypadku typu “dynamic” w odróżnieniu od “object” można korzystać z podpowiedzi edytora co do zaimplementowanych właściwości i metod ponieważ kompilator w momencie odpytywania (stawiania kropki) wie z jakim typem ma do czynienia. Z tego powodu typu “object” praktycznie się nie używa.

Warto pamiętać, że przypisaniu typu “dynamic” jest bardzo wolne (przynajmniej przy pierwszym wywołaniu metody - ponieważ kompilator DLR sprawdza na początku czy metoda nie została już wcześniej skompilowana). W praktyce typ “dynamic” jest bardzo rzadko używany.

Źródła: Źródła własne

Tomasz Osiński Tomasz Osiński
Typowania - porównanie typowań domniemanych, statycznych i dynamicznych: “dynamic”, “var”, “object”
2017-06-11 20:55:25
Komentarze
Aby dodac komentarz musisz być zalogowany

Zobacz podobne artykuły

Nazywam się Tomasz Osiński. Jestem programistą web developerem od 2008 roku. Obecnie pracuję w Banku Millennium jak .NET web developer, poza tym rozwijam startupy, blogguję. Pokazuję, że za pomocą ASP.NET, HTML, CSS i JS można budować wydajne aplikacje i strony internetowe. Ukazuję potrzeby wdrażania nowoczesnego podejścia do zarządzania w IT (Lean, Kanban, SCRUM, Agile)

Blog, który czytasz tworzę w w/w technologiach i udostępniam na GitHubie