Różnica między obiektem, dynamicznym i Var

Muszę znać różnicę między tymi trzema słowami kluczowymi Object , Dynamic i var W C#.

Widziałem ten link ale nie rozumiem, w którym przypadku muszę użyć każdego z nich.

Czy możesz mi wyjaśnić, proszę, różnicę między tymi słowami kluczowymi ? Jakie są narzędzia każdego słowa kluczowego?
Author: Stephen Kennedy, 2014-01-13

8 answers

Wszystko jest Object to jest typ bazowy. Każdy typ dziedziczy z Object w jednej chwili prostą zmienną int można przestawić na object. Na przykład:

object a = 10; // int
object b = new Customer(); // customer object
object c = new Product(); // product object
object d = "Jon"; // string
object e = new { Name = "Felipe", Age = 20 }; // anonymous type

Jest to najbardziej abstrakcyjny dla każdego typu i jest typem odniesienia. Jeśli chcesz uzyskać prawdziwy typ, musisz unbox go (używając strategii conversaion, takiej jak metody, odlewy itp.):

object a = "Some Text";
string text = a.ToString();

// call a string method
text = text.ToUpper();

object i = 10; // declared as object but instance of int
int intValue = (int) i; //declare as an int ... typed

Dynamic jest implementacją dynamicznego aspektu w C#, nie jest mocno typowana. Na przykład:

dynamic a = new Class();
a.Age = 18;
a.Name = "Jon";
a.Product = new Product();

a.Name; // read a string
a.Age; // read an int
a.Product.Name; // read a property
a.Product.MoveStock(-1); // call a method from Product property.

var jest tylko słowem kluczowym języka C#, które pozwala zdefiniować dowolny obiekt typu, ponieważ zainicjalizujesz go wartością i określi typ z tej wartości, na przykład:

var a = 10; // int
var b = 10d; // double
var c = "text"; // string
var p = new Product(); // Product type

Kompilator sprawdzi Typ zdefiniowanej wartości i ustawi ją na obiekcie.

 27
Author: Felipe Oriani,
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
2017-12-11 00:21:46

Obiekt: Każdy obiekt w C# jest pochodną typu object, bezpośrednio lub pośrednio. Jest zmienną czasową kompilacji i wymaga boksu i unboxingu do konwersji i sprawia, że jest powolny. Możesz zmienić typ wartości na typ odniesienia i odwrotnie.

    public void CheckObject()
    {
        object test = 10;
        test = test + 10;    // Compile time error
        test = "hello";      // No error, Boxing happens here
    }

Var: Jest zmienną czasową kompilacji i nie wymaga boksu i rozpakowywania. Ponieważ Var jest funkcją czasu kompilacji, sprawdzanie typu odbywa się tylko w czasie kompilacji. Po zainicjowaniu Var nie można zmienić typu zapisanego w to.

    public void CheckVar()
    {
        var test = 10;         // after this line test has become of integer type
        test = test + 10;    // No error
        test = "hello";        // Compile time error as test is an integer type
    }

Dynamiczny: Jest zmienny czas pracy i nie wymaga boksu i rozpakowywania. Możesz przypisać i wartość do dynamic, a także możesz zmienić typ wartości przechowywany w tym samym. Wszystkie błędy w dynamic można wykryć tylko w czasie wykonywania. Możemy również powiedzieć, że dynamic jest obiektem run time, który może pomieścić dowolny typ danych.

    public void CheckDynamic()
    {
        dynamic test = 10;
        test = test + 10;    // No error
        test = "hello";       // No error, neither compile time nor run time
    }
 34
Author: Love 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
2014-06-25 05:27:10

1) var służy do niejawnej definicji typu. Na przykład, jeśli zdefiniujesz zmienną w ten sposób:

var number = 123;

Kompilator wywiera typ na podstawie przypisanej wartości i zmiennej zainicjalizowanej jako liczba całkowita w czasie kompilacji . Po tej definicji nie można przypisać string do zmiennej, ponieważ jest to liczba całkowita.I nie możesz używać var w ten sposób:

var number;
number = 123;

Ponieważ musisz przypisać coś do zmiennej, jeśli używasz słowa kluczowego var, aby Typ można określić.

2) Object jest klasą bazową dla wszystkich klas. W {[12] } wszystkie klasy dziedziczą z klasy obiektu, dlatego możesz przypisać wszystko do obiektu.Na przykład:

object str = "bla bla bla..."; 
str = 234;
str = DateTime.Now;

To działa, ponieważ kiedy robisz to Boks / unboxing wykonując automatycznie dla Ciebie. W przeciwieństwie do słowa kluczowego var możesz użyć object w następujący sposób:

object myVariable;
myVariable = "bla bla bla..";

3) dynamic jest fajną funkcją, która została dostarczona z C# 4.0, możesz użyć dynamic, jeśli nie wiesz, Wpisz z funkcji w czasie kompilacji.Twój typ zostanie określony w run-time.Dlatego nie można używać intellisense ze zmiennymi dynamicznymi.

Możesz użyć dynamiki w następujący sposób:

dynamic myObj = SomeMethod();
myObj.DoSomething();
myObj.Method1();

Ale musisz być ostrożny, gdy używasz dynamiki.Ponieważ jeśli wywołasz metodę lub właściwość, która nie istnieje, otrzymasz RuntimeBinderException w runtime.

I ostatnia rzecz, o której chcę wspomnieć, dynamic i object mogą być parametrami typu, ale var nie mogą. na przykład możesz to:

public void SomeMethod(dynamic arg1)

Ale nie możesz tego zrobić:

public void SomeMethod(var arg1)

Ponieważ var nie jest typem, a raczej cukrem składniowym pozwalającym kompilatorowi wywnioskować Typ za Ciebie.

 8
Author: Selman Genç,
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
2017-07-05 11:23:23

Object jest klasą root, z której wywodzą się wszystkie obiekty. NET.

var jest używany jako skrót, jeśli nie chcesz pisać say string x = "a", ale zamiast tego napisz var x = "a". To działa tylko wtedy, gdy kompilator może dowiedzieć się, co masz na myśli.

dynamic oznacza to, że to, co robisz z obiektem, jest ewaulowane tylko w czasie wykonywania (x.StrangeMethod() nie spowoduje błędu kompilacji, nawet jeśli metoda nie istnieje), przydatne podczas interakcji z językami skryptowymi.

 6
Author: Dani J,
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-01-12 21:17:03

To dość proste ... ]}

Object jest typem bazowym w .NET. wszystkie pozostałe typy są dziedziczone z niego. Tak więc zmienna typu object może zawierać wszystko. Ale należy to zrobić tylko nie ma innych opcji, z następujących powodów:

  1. Przed odczytem/zapisem do tej zmiennej musimy wykonać operacje unboxingu/boksu, które są kosztowne.

  2. Kompilator nie może sprawdzać typu w czasie kompilacji, co może powodować błędy i wyjątki w czasie wykonywania. Na przykład ten kod zostanie skompilowany pomyślnie, ale rzuci wyjątek w czasie wykonywania:

    object o = "2"; 
    int i = 1 + (int)o;
    

Var nie jest typem, ale instrukcją dla kompilatora, aby zawrzeć typ zmiennej z kontekstu programu. Jest potrzebny do anonimowych metod, ale może być również używany wszędzie, gdzie chcesz. Uważaj tylko twój program nie stał się trudny do odczytania. Kompilator podejmuje decyzję w czasie kompilacji, więc nie będzie miał żadnego wpływu na program wydajność.

Dynamic - jest specjalnym typem, dla którego kompilator nie sprawdza typu w czasie kompilacji. Typ jest określony w czasie wykonywania przez CLR. To jest statyczne (!) typu i po określeniu typu zmiennej nie można jej później zmienić. Powinniśmy używać tego typu tylko, że nie ma innych opcji z podobnych powodów z typem obiektu:

  1. Istnieje operacja dodawania, aby określić typ w czasie wykonywania-co zmniejsza program wydajność.

  2. Kompilator nie wykonuje sprawdzania typu, które może powodować błędy i wyjątki w czasie wykonywania.

 4
Author: Lebedev Alexei,
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-01-13 15:04:08

Poniżej przedstawiono różnicę między systemem.Object, dynamic oraz var.

Wszystko w. Net pochodzi z systemu.Typ obiektu. Ale jeśli szukasz konkretnej różnicy, oto one.

Różnica między obiektem a dynamiką.

1.Nie można domyślnie przypisać zmiennej typu obiekt do żadnego innego typu. Kompilator ci na to nie pozwoli. Z drugiej strony Ty może pośrednio oddawać dowolny typ do dynamiki. Kompilator nie będzie narzekał bo casting będzie być wykonywane w czasie wykonywania i wyjątku, jeżeli wymagane będzie podniesiony w czasie uruchomienia. 2.Ponieważ dynamic jest takie samo jak object, nie można pisać przeciążonych metod, które różnią się w obiektach i dynamiczne w argumentach.

Różnica między dynamicznym i var.

1.Deklarowanie zmiennej lokalnej jako dynamicznej lub var ma tylko różnicę składniową. 2. Nie Można zadeklarować zmiennej typu var bez jej inicjalizacji, ale można to zrobić dla zmiennej dynamicznej 3. Nie można użyć var zmienna przekazywana jako argument metody lub zwracana z metody. 4. Nie można oddać wyrażenia do var, ale można to zrobić dla zmiennej dynamicznej.

 3
Author: jewel jose,
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
2015-12-27 23:14:52

Obiekt

Podstawowy obiekt. NET, przez większość czasu nie będziesz musiał go używać.

Var

Po prostu cukrem składniowym, za każdym razem, gdy używasz var, typ zmiennej będzie ustalany w czasie kompilacji zgodnie z przypisaną do niej wartością.

Dynamic

Pochodzi z DLR części. NET, będzie potrzebny tylko wtedy, gdy chcesz użyć nietrwałego typowania.

 2
Author: Clueless,
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-03-20 09:00:50

Kompilator mówi, że var jest kontekstowym słowem kluczowym używanym do deklaracji zmiennych. dlatego musimy przypisać wartość w momencie deklaracji. następnie kompilator sprawdza ich typ danych i traktuje je w ten sam sposób. W ten sposób kompilator wie wszystko o tej zmiennej i zakłada na niej bezpieczeństwo typu.

 0
Author: Vikas Thombre,
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
2018-06-20 11:15:57