Jaka jest różnica między dynamicznym (C # 4) A var?

Czytałem mnóstwo artykułów o tym nowym słowie kluczowym, które jest wysyłane z C# v4, ale nie mogłem dostrzec różnicy między " dynamicznym "i"var".

Ten artykuł dał mi do myślenia, ale nadal nie widzę żadnej różnicy.

Czy Można używać " var " tylko jako zmiennej lokalnej, ale dynamicznej zarówno jako lokalnej jak i globalnej?

Czy możesz pokazać kod bez dynamicznego słowa kluczowego, a następnie pokazać ten sam kod z dynamicznym słowem kluczowym?

 200
Author: Cœur, 2009-06-07

14 answers

var jest typowany statycznie-kompilator i runtime znają Typ - po prostu oszczędzają Ci trochę pisania... następujące są w 100% identyczne:

var s = "abc";
Console.WriteLine(s.Length);

I

string s = "abc";
Console.WriteLine(s.Length);

Wszystko, co się stało, to to, że kompilator zorientował się, że s musi być ciągiem znaków (z inicjalizatora). W obu przypadkach wie (w IL), że s.Length oznacza właściwość (instancja) string.Length.

dynamic jest bardzo inna bestia; jest najbardziej podobna do object, ale z "dynamic dispatch": {]}

dynamic s = "abc";
Console.WriteLine(s.Length);

Tutaj s jest wpisywane jako dynamiczne . Nie wie o string.Length, ponieważ nie wie o nic o s w czasie kompilacji. Na przykład, następujące kompiluje (ale nie uruchamia) też:

dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
W czasie wykonywania (tylko), to sprawdzić dla FlibbleBananaSnowball właściwości - nie można go znaleźć, i eksplodować w prysznicu iskier.

Z dynamic, właściwości / metody / operatory / etc są rozwiązywane w czasie wykonywania, na podstawie na rzeczywistym obiekcie. Bardzo przydatny do rozmowy z COM( który może mieć właściwości tylko w trybie runtime), DLR lub innymi systemami dynamicznymi, takimi jak javascript.

 460
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-07 09:51:34

Zmienne zadeklarowane przez var są niejawne, ale statycznie wpisywane. Zmienne zadeklarowane przez dynamic{[2] } są wpisywane dynamicznie. 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ą rozwiązywane w czasie wykonywania, deklaracje var są rozwiązywane w czasie kompilacji.

 58
Author: Hans Van Slooten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-07 09:49:29

Wyjaśnię różnicę pomiędzy dynamicznym i var .

dynamic d1;
d1 = 1;
d1 = "http://mycodelogic.com";
To zadziała. kompilator może ponownie utworzyć typ zmiennej dynamic .
najpierw tworzy Typ jako integer , a następnie kompilator odtwarza Typ jako string
ale w przypadku var
var v1;  // Compiler will throw error because we have to initialized at the time of declaration  
var v2 = 1; // Compiler will create v1 as **integer**
v2 = "Suneel Gupta"; // Compiler will throw error because, compiler will not recreate the type of variable 


Przy użyciu słowa kluczowego ' var ', o typie decyduje kompilator w czasie kompilacji, natomiast przy użyciu Słowo kluczowe ' dynamic ', o typie decyduje runtime.
'słowo kluczowe var', silnie wpisana zmienna lokalna, dla której kompilator jest w stanie określić typ z wyrażenia inicjalizacyjnego - bardzo przydatne podczas programowania LINQ.
kompilator nie posiada żadnych informacji o typie zmiennej dynamic . więc kompilator nie pokaże żadnej inteligencji .
kompilator posiada wszystkie informacje o przechowywanej wartości var typu so kompilator pokaże inteligencję.
Typ dynamiczny może być przekazany jako argument funkcji i funkcja może również zwracać typ obiektu
, Ale
Typ var nie może być przekazany jako argument funkcji i funkcja nie może zwracać typu obiektu. Ten typ zmiennej może pracować w zakresie, w którym została zdefiniowana.
 42
Author: Suneel Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-17 20:07:25

Var oznacza, że stosowane jest statyczne sprawdzanie typu (wczesne Wiązanie). dynamic oznacza, że stosowane jest dynamiczne sprawdzanie typu (późne wiązanie). Pod względem kodu wyróżnia się:

class Junk
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}

class Program
{
    static void Main(String[] args)
    {
        var a = new Junk();
        dynamic b = new Junk();

        a.Hello();

        b.Hello();
    }
}

Jeśli skompilujesz to i sprawdzisz wyniki za pomocą ILSpy, okaże się, że kompilator dodał kod opóźnionego wiązania, który obsłuży wywołanie Hello() z b, podczas gdy wczesne Wiązanie becuase zostało zastosowane do A, a jest w stanie wywołać Hello() bezpośrednio.

Np. (ILSpy demontaż)

using System;
namespace ConsoleApplication1
{
    internal class Junk
    {
        public void Hello()
        {
            Console.WriteLine("Hello");
        }
    }
}

using Microsoft.CSharp.RuntimeBinder;
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication1
{
    internal class Program
    {
        [CompilerGenerated]
        private static class <Main>o__SiteContainer0
        {
            public static CallSite<Action<CallSite, object>> <>p__Site1;
        }
        private static void Main(string[] args)
        {
            Junk a = new Junk();      //NOTE: Compiler converted var to Junk
            object b = new Junk();    //NOTE: Compiler converted dynamic to object
            a.Hello();  //Already Junk so just call the method.

                          //NOTE: Runtime binding (late binding) implementation added by compiler.
            if (Program.<Main>o__SiteContainer0.<>p__Site1 == null)
            {
                Program.<Main>o__SiteContainer0.<>p__Site1 = CallSite<Action<CallSite, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.ResultDiscarded, "Hello", null, typeof(Program), new CSharpArgumentInfo[]
                {
                    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
                }));
            }
            Program.<Main>o__SiteContainer0.<>p__Site1.Target(Program.<Main>o__SiteContainer0.<>p__Site1, b);
        }
    }
}

Najlepszą rzeczą, jaką możesz zrobić, aby odkryć różnicę, jest napisanie małej aplikacji na konsolę, takiej jak ta i przetestowanie jej samemu za pomocą ILSpy.

 14
Author: Matthew Layton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-29 13:56:12

Jedna duża różnica - możesz mieć dynamiczny Typ powrotu.

dynamic Foo(int x)
{
    dynamic result;

    if (x < 5)
      result = x;
    else
      result = x.ToString();

    return result;
}
 12
Author: user2382351,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 20:45:05

Oto prosty przykład pokazujący różnicę pomiędzy Dynamic (4.0) i Var

dynamic  di = 20;
dynamic ds = "sadlfk";
var vi = 10;
var vsTemp= "sdklf";

Console.WriteLine(di.GetType().ToString());          //Prints System.Int32
Console.WriteLine(ds.GetType().ToString());          //Prints System.String
Console.WriteLine(vi.GetType().ToString());          //Prints System.Int32
Console.WriteLine(vsTemp.GetType().ToString());      //Prints System.String

**ds = 12;**   //ds is treated as string until this stmt now assigning integer.

Console.WriteLine(ds.GetType().ToString());          **//Prints System.Int32**

**vs = 12**; //*Gives compile time error* - Here is the difference between Var and Dynamic. var is compile time bound variable.

Shiva Mamidi

 10
Author: Shiva Mamidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-08 21:48:49

var jest tylko skrótem od zwykłej deklaracji typu, gdzie pozwalasz kompilatorowi odgadnąć właściwy typ.

dynamic jest nowym (statycznym) typem, gdzie wszystkie kontrole są wykonywane w czasie wykonywania, a nie przez kompilator.

 7
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-07 09:51:36

Typ zmiennej zadeklarowanej przez var jest określony przez kompilator, jest skrótem do określenia nazwy typu, nic więcej.

Jednakże dynamika jest określana w czasie wykonywania, kompilator nie ma pojęcia o rzeczywistym typie, a wszystkie metody/pola/właściwości tej zmiennej zostaną opracowane w czasie wykonywania.

 4
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-07 09:52:58

Ten {[4] } jest fajnym filmikiem na youtube, który opowiada o var VS Dynamic z praktyczną demonstracją.

Poniżej znajduje się bardziej szczegółowe wyjaśnienie z migawką.

Var jest wcześnie wiązany (sprawdzany statycznie), podczas gdy dynamiczny jest późno wiązany (dynamicznie oceniany).

Słowo kluczowe Var patrzy na dane z prawej strony, a następnie podczas kompilacji decyduje o danych z lewej strony type.In inne słowa kluczowe var po prostu oszczędza wpisując wiele rzeczy. Spójrz na poniższy obrazek gdzie gdy podaliśmy dane string i zmienna x pokazuje typ danych string w mojej podpowiedzi.

Tutaj wpisz opis obrazka

Z drugiej strony dynamiczne słowo kluczowe służy zupełnie innemu celowi. Obiekty dynamiczne są oceniane podczas wykonywania. Na przykład w poniższym kodzie właściwość "Length" istnieje lub nie jest obliczana podczas runtime.Celowo wpisałem małe "l", więc ten program skompilował się dobrze, ale kiedy faktycznie wykonał, wyrzucił błąd podczas wywoływania właściwości "length" ( SMALL "l").

Tutaj wpisz opis obrazka

 3
Author: Shivprasad Koirala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 08:39:09

Zmienna dynamiczna i zmienna var mogą przechowywać dowolny typ wartości, ale wymagane do zainicjowania 'var' w momencie deklaracji.

Kompilator nie posiada żadnych informacji o zmiennej typu 'dynamic'. var jest bezpieczny dla kompilatora tzn. kompilator posiada wszystkie informacje o przechowywanej wartości, tak aby nie powodował żadnych problemów w czasie wykonywania.

Typ dynamiczny może być przekazany jako argument funkcji i funkcja może go również zwrócić. Typ Var nie może być przekazany jako argument funkcji i funkcja nie może zwracać typu obiektu. Ten typ zmiennej może pracować w zakresie, w którym została zdefiniowana.

W przypadku dynamicznego odlewania nie jest wymagane, ale trzeba znać właściwość i metody związane z przechowywanym typem, natomiast dla var nie ma potrzeby odlewania, ponieważ kompilator ma wszystkie informacje do wykonania operacji.

Dynamic: przydatne przy kodowaniu przy użyciu reflection lub dynamic language support lub z obiektami COM, ponieważ wymagamy mniejszej ilości kodu.

Var: Przydatne podczas uzyskiwania wyniku z zapytań linq. W 3.5 framework wprowadza obsługę funkcji linq.

Reference: Counsellingbyabhi

 2
Author: Abhishek Gahlout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 08:36:34
  1. var i dynamiczne definiowanie typu.
  2. var w czasie kompilacji, podczas gdy dynamiczne są w czasie wykonywania.
  3. w deklaracji var i inicjalizacji obie są obowiązkowe jak stała zmienna, podczas gdy
  4. w dynamicznej inicjalizacji może być w czasie wykonywania jak tylko zmienne readonly.
  5. w typie var niezależnie od tego, jaki typ zostanie określony w czasie inicjalizacja nie może się zmienić dalej, ale
  6. dynamic może przyjąć dowolny typ danych, nawet zdefiniowany przez użytkownika.
 2
Author: shhhhh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 08:23:48

Nie mylić dynamic i var. Deklarowanie zmiennej lokalnej za pomocą var jest tylko skrótem składniowym, który kompilator wywiera określony typ danych z wyrażenia. Słowo kluczowe var może być używane tylko do deklarowania zmiennych lokalnych wewnątrz metody, podczas gdy słowo kluczowe dynamic może być używane do zmiennych lokalnych, pól i argumentów. Wyrażenia nie można oddać do var, ale można je oddać do dynamic. Musisz jawnie zainicjować zmienną zadeklarowaną za pomocą var, gdy to zrobisz nie trzeba inicjalizować zmiennej zadeklarowanej dynamicznie.

 1
Author: Kartik M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 10:52:11
  1. słowo kluczowe Var (Implicit typed local variable) służy do definiowania lokalnego variables.In w przypadku Var, bazowy typ danych jest ustalany w czasie kompilacji na podstawie początkowego przypisania.Po dokonaniu początkowego przypisania z typem Var, zostanie ono mocno wpisane.Jeśli spróbujesz zapisać niezgodną wartość z typem Var, spowoduje to błąd w czasie kompilacji.

Przykład:

Var strNameList=new List<string>(); By using this statement we can store list of names in the string format. 
strNameList.add("Senthil");
strNameList.add("Vignesh");

strNameList.add(45); // This statement will cause the compile time error.

Ale w typie dynamicznym określa się typ bazowy tylko w czasie biegu.Dynamiczny typ danych nie jest sprawdzany podczas kompilacji, a także nie jest mocno wpisywany.Możemy przypisać dowolną wartość początkową dla typu dynamicznego, a następnie można ją przypisać do dowolnej nowej wartości w czasie jej życia.

Przykład:

dynamic test="Senthil";
Console.Writeline(test.GetType())  // System.String

test=1222;
Console.Writeline(test.GetType())  // System.Int32

test=new List<string>();
Console.Writeline(test.GetType())  //System.Collections.Generic.List'1[System.String]

Nie zapewnia wsparcia IntelliSense also.It nie daje lepszego wsparcia, gdy dajemy pracę z linq również.Ponieważ nie obsługuje wyrażeń lambda, metod rozszerzeń i metod anonimowych.

 1
Author: kuttychutty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 04:05:26

Oto różnice

  • Zmienna jest wpisywana statycznie (czas kompilacji), dynamiczna jest wpisywana dynamicznie (czas wykonania)

  • Zmienna zadeklarowana jako var może być używana tylko lokalnie, dynamicznie zmienne mogą być przekazywane jako params do funkcji (podpis funkcji może zdefiniować param jako dynamiczny, ale nie var).

  • Z dynamiczną rozdzielczością właściwości dzieje się w czasie wykonywania i tak nie jest w przypadku var, co oznacza w czasie kompilacji dowolną zmienną zadeklarowana jako dynamic może wywołać metodę, która może lub nie istnieje i więc kompilator nie wyrzuci błędu.

  • Typ casting z var nie jest możliwe, ale z dynamicznym its możliwe (można oddać obiekt jako dynamiczny, ale nie jako var).

Arun Vijayraghavan

 1
Author: Arun Vijayraghavan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-06 15:36:55