var
ma typ statyczny - kompilator i środowisko wykonawcze znają typ - po prostu oszczędzają ci pisania ... następujące elementy są w 100% identyczne:
var s = "abc";
Console.WriteLine(s.Length);
i
string s = "abc";
Console.WriteLine(s.Length);
Wszystko, co się wydarzyło, polegało na tym, że kompilator zorientował się, że s
musi to być ciąg znaków (z inicjatora). W obu przypadkach wie (w IL), że s.Length
oznacza właściwość (instancja) string.Length
.
dynamic
jest zupełnie inną bestią; jest najbardziej podobny do object
dynamicznej wysyłki:
dynamic s = "abc";
Console.WriteLine(s.Length);
Tutaj s
jest wpisany jako dynamiczny . Nie wie o tym string.Length
, ponieważ nie wie nic o s
czasie kompilacji. Na przykład następujące polecenia również skompilują (ale nie uruchomią):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
W czasie wykonywania (tylko), to sprawdzić za FlibbleBananaSnowball
nieruchomości - uda się go znaleźć, i eksplodować w deszcz iskier.
Za pomocą dynamic
właściwości / metod / operatorów / itp. Są rozwiązywane w czasie wykonywania na podstawie rzeczywistego obiektu. Bardzo przydatny do rozmowy z COM (który może mieć właściwości tylko w czasie wykonywania), DLR lub innymi systemami dynamicznymi, takimi jak javascript
.
var
można wywnioskować typy, które mogą nie być pożądane z powodu podtypów i niejawnych rzutów. Oznacza to, żevar
mógł rozwiązać typ statystycznie inny niż oczekiwano, gdy wystąpią niejawne rzuty (w szczególności na bardziej ogólny typ, ale nie jest to ograniczone do tego). Trywialnym przykładem jestobject x = ""
vs.var x = ""
vs.var x = "" as object
, ale mogą wystąpić inne bardziej podstępne (i realistyczne) przypadki, które mogą powodować subtelne błędy.WriteLine
wywołać. To „wiązanie” ma miejsce podczas kompilacji. W takim przypadkudynamic
typ.Length
musi byćdynamic
również i dopiero w czasie wykonywania decyduje się, które przeciążenie (jeśli w ogóle)WriteLine
pasuje najlepiej. Wiązanie odbywa się w czasie wykonywania.var
słowo kluczowe w Visual Studio wyświetlany jest faktyczny typ, który jest wnioskowany. Pokazuje, że typ jest znany w czasie kompilacji.Zmienne zadeklarowane za pomocą var są domyślnie, ale statycznie typowane. Zmienne zadeklarowane za pomocą dynamiki są dynamicznie wpisywane. Ta funkcja została dodana do CLR w celu obsługi dynamicznych języków, takich jak Ruby i Python.
Powinienem dodać, że oznacza to, że deklaracje dynamiczne są rozstrzygane w czasie wykonywania, deklaracje var są rozstrzygane w czasie kompilacji.
źródło
Wyjaśnię różnicę między dynamiką a var .
To zadziała. kompilator może odtworzyć typ zmiennej dynamicznej .
najpierw tworzy typ jako liczbę całkowitą, a następnie kompilator odtworzy typ jako ciąg znaków,
ale w przypadku var
źródło
var oznacza, że stosowane jest sprawdzanie typu statycznego (wczesne wiązanie). dynamiczny oznacza, że stosowane jest dynamiczne sprawdzanie typu (późne wiązanie). Pod względem kodu należy wziąć pod uwagę następujące kwestie:
Jeśli to skompilujesz i sprawdzisz wyniki za pomocą ILSpy, przekonasz się, że kompilator dodał jakiś późny kod wiązania, który obsłuży wywołanie Hello () z b, a ponieważ wcześniejsze wiązanie zostało zastosowane do a, a może wywołać Hello () bezpośrednio.
np. (demontaż ILSpy)
Najlepszą rzeczą, jaką możesz zrobić, aby odkryć różnicę, jest napisanie sobie małej aplikacji na konsolę, takiej jak ta, i przetestowanie jej samodzielnie za pomocą ILSpy.
źródło
Jedna wielka różnica - możesz mieć dynamiczny typ zwrotu.
źródło
Oto prosty przykład, który pokazuje różnicę między Dynamic (4.0) a Var
Shiva Mamidi
źródło
**
znaków w przykładzie kodu ma na celu jedynie wskazanie wyróżnienia i nie jest częścią rzeczywistego działającego kodu.var
jest tylko skrótem dla normalnej deklaracji typu, gdzie pozwalasz kompilatorowi odgadnąć właściwy typ.dynamic
jest nowym (statycznym) typem, w którym wszystkie kontrole są wykonywane w czasie wykonywania, a nie przez kompilator.źródło
Typ zmiennej zadeklarowanej za pomocą var jest określany przez kompilator, jest to skrót do określania nazwy typu, nic więcej.
Jakkolwiek dynamika jest określana w czasie wykonywania, kompilator nie ma pojęcia o rzeczywistym typie, a wszystkie dostępy do metod / pól / właściwości z tą zmienną zostaną opracowane w czasie wykonywania.
źródło
To fajny film na YouTube, który opowiada o
var
VSDynamic
z praktyczną demonstracją.Poniżej znajduje się bardziej szczegółowe objaśnienie z migawką.
Var jest wcześnie wiązany (sprawdzany statycznie), podczas gdy dynamiczny jest późno wiązany (oceniany dynamicznie).
Słowo kluczowe Var sprawdza dane po prawej stronie, a następnie podczas kompilacji decyduje o typie danych po lewej stronie. Innymi słowy, słowo kluczowe var oszczędza Ci pisania wielu rzeczy. Spójrz na poniższy obrazek, gdzie kiedy podaliśmy dane ciągu, a zmienna x pokazuje typ danych ciągu w mojej podpowiedzi.
Z drugiej strony dynamiczne słowo kluczowe ma zupełnie inny cel. Obiekty dynamiczne są oceniane podczas działania. Na przykład w poniższym kodzie właściwość „Długość” istnieje lub nie jest oceniana w czasie wykonywania. Celowo wpisałem małe „l”, więc ten program skompilował się dobrze, ale kiedy faktycznie się uruchomił, wyrzucił błąd, gdy właściwość „długość” został nazwany (SMALL „l”).
źródło
zarówno zmienna dynamiczna, jak i zmienna var mogą przechowywać dowolny rodzaj wartości, ale jest ona wymagana do zainicjowania „var” w momencie deklaracji.
Kompilator nie ma żadnych informacji o typie zmiennej „dynamicznej”. var jest bezpieczny dla kompilatora, tzn. kompilator ma wszystkie informacje o przechowywanej wartości, dzięki czemu nie powoduje żadnych problemów w czasie wykonywania.
Typ dynamiczny można przekazać jako argument funkcji, a funkcja może go również zwrócić. Typ zmiennej nie może być przekazany jako argument funkcji, a funkcja nie może zwrócić typu obiektu. Ten typ zmiennej może działać w zakresie, w którym został zdefiniowany.
W przypadku dynamicznego rzutowania nie jest wymagane, ale musisz znać właściwość i metody związane z typem przechowywanym, natomiast dla var Nie trzeba rzutować, ponieważ kompilator ma wszystkie informacje do wykonania operacji.
dynamiczny: Przydatny przy kodowaniu z wykorzystaniem refleksji lub obsługi języka dynamicznego lub z obiektami COM, ponieważ wymagamy mniejszej ilości kodu.
var: Przydatny przy uzyskiwaniu wyników z zapytań linq. W wersji 3.5 wprowadza obsługę Linq.
Odniesienie: Counsellingbyabhi
źródło
źródło
Nie myl dynamiki i var. Zadeklarowanie zmiennej lokalnej za pomocą var jest tylko skrótem składniowym, w którym kompilator wyprowadza określony typ danych z wyrażenia. Słowa kluczowego var można używać tylko do deklarowania zmiennych lokalnych w metodzie, natomiast słowa kluczowego dynamicznego można używać do zmiennych lokalnych, pól i argumentów. Nie możesz rzutować wyrażenia na var, ale możesz rzutować wyrażenie na dynamiczne. Musisz jawnie zainicjować zmienną zadeklarowaną za pomocą var, podczas gdy nie musisz inicjować zmiennej zadeklarowanej dynamicznie.
źródło
Przykład:
Ale w typie dynamicznym typ bazowy jest określany tylko w czasie wykonywania. Dynamiczny typ danych nie jest sprawdzany w czasie kompilacji, a także nie jest silnie typowany. Możemy przypisać dowolną wartość początkową dla typu dynamicznego, a następnie można ją ponownie przypisać do dowolnego nowego wartość w ciągu swojego życia.
Przykład:
Nie zapewnia również wsparcia IntelliSense. Nie zapewnia lepszego wsparcia, gdy dajemy również pracę z linq, ponieważ nie obsługuje wyrażeń lambda, metod rozszerzenia i metod anonimowych.
źródło
Oto różnice
var jest wpisywany statycznie (czas kompilacji), dynamiczny jest dynamicznie wpisywany (czas wykonywania)
Zmienna zadeklarowana jako var może być używana tylko lokalnie, zmienne dynamiczne mogą być przekazywane jako parametry funkcji (podpis funkcji może definiować parametr jako dynamiczny, ale nie zmienny).
z dynamiką rozdzielczość właściwości zachodzi w czasie wykonywania i tak nie jest w przypadku var, co oznacza, że w czasie kompilacji każda zmienna zadeklarowana jako dynamiczna może wywołać metodę, która może istnieć lub nie, a więc kompilator nie zgłasza błędu.
Typ rzutowania z var nie jest możliwy, ale z dynamicznym jest to możliwe (możesz rzutować obiekt tak dynamicznie, ale nie jako var).
Arun Vijayraghavan
źródło