Object,Dynamic和Var之间的区别

我需要知道这三个关键字ObjectDynamic和C#中的var之间的区别。

我看过这个链接,但我不明白在哪种情况下我必须使用每一个。

你能解释一下这些关键词之间的区别吗? 每个关键字的用途是什么?

一切都是Object这是一个基本类型。 每一种类型都会在瞬间从Objectinheritance,一个简单的int变量可以装箱到一个object 。 例如:

 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 

它是任何类型的最抽象,它是一个引用类型。 如果你想获得真实的类型,你需要将其unbox (使用转换策略,如方法,强制转换等):

 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是C#中动态方面的实现,它不是强类型的。 例如:

 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只是C#语言的一个关键字,它允许您定义类型的任何对象,因为您使用值初始化它,它将从该值确定类型,例如:

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

编译器将检查您定义的值的类型并将其设置在对象上。

宾语:

C#中的每个对象都是直接或间接从对象类型派生的。 它是编译时变量,需要装箱和拆箱才能进行转换,这会让它变慢。 您可以将值类型更改为引用类型,反之亦然。

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

VAR:

它是编译时变量,不需要装箱和拆箱。 由于Var是编译时function,因此所有类型检查仅在编译时完成。 Var初始化后,您无法更改存储在其中的类型。

 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 } 

动态:

它是运行时变量,不需要装箱和拆箱。 您可以为动态分配和赋值,也可以更改存储在其中的值类型。 动态上的所有错误只能在运行时发现。 我们还说动态是一个运行时对象,可以保存任何类型的数据。

 public void CheckDynamic() { dynamic test = 10; test = test + 10; // No error test = "hello"; // No error, neither compile time nor run time } 

1) var用于隐式类型定义。 例如,如果您定义这样的变量:

 var number = 123; 

编译器根据指定的值推断类型,并在编译时将变量初始化为整数。 在此定义之后,您无法为变量分配string ,因为它是一个整数。并且您不能像这样使用var

 var number; number = 123; 

因为如果使用var关键字,必须为变量赋值,以便可以确定类型。

2) Object是所有类的基类。 在C#所有类都inheritance自对象类,因此您可以将所有内容分配给对象。例如:

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

这是有效的,因为当您执行此装箱/拆箱时会自动执行此操作。 与var关键字相反,您可以使用如下object

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

3) dynamicC# 4.0附带的一个很酷的function,你可以使用dynamic如果你不知道在编译时你的函数返回类型。你的类型将在run-time确定。因此你不能使用intellisense与动态变量。

您可以像这样使用动态:

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

但是在使用dynamic时必须小心。因为如果调用不存在的方法或属性,您将在运行时获得RuntimeBinderException

最后我想提一下, dynamicobject可以是参数类型,但var不能。 例如,你可以这样做:

 public void SomeMethod(dynamic arg1) 

但你不能这样做:

 public void SomeMethod(var arg1) 

因为var不是一个类型而是让编译器为你推断类型的语法糖。

Object是所有.net对象派生自的根类。

如果你不想写string x = "a" ,而是写var x = "a" ,则var用作快捷方式。 它只适用于编译器可以弄清楚你的意思。

dynamic意味着你对对象的处理只是在运行时得到的( x.StrangeMethod()不会导致编译错误,即使该方法不存在),在与脚本语言交互时很有用。

这很简单……

Object是.NET中的基类型。 所有其他类型都inheritance自它。 所以对象类型的变量可以包含所有内容。 但是应该只在没有其他选择的情况下完成,原因如下:

  1. 在读取/写入此变量之前,我们必须完成拆箱/装箱操作,这些操作很昂贵。

  2. 编译器无法在编译时进行类型检查,这可能会在运行时导致错误和exception。 例如,此代码将成功编译,但在运行时抛出exception:

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

Var不是类型,而是编译器从程序上下文中结束变量类型的指令。 它需要匿名方法,但也可以在任何地方使用。 请注意,您的程序不会变得难以阅读。 编译器在编译时做出决定,因此不会对程序效率产生任何影响。

动态 – 是一种特殊类型,编译器在编译时不会对其进行类型检查。 CLR在运行时指定类型。 这是静态(!)类型,并且在指定变量类型之后,以后不能更改它。 我们应该使用这种类型,因为类似的原因只有对象类型没有其他选项:

  1. 在运行时有一个添加操作来指定类型 – 这会降低程序效率。

  2. 编译器不执行可能在运行时导致错误和exception的类型检查。

宾语

.net的基础对象,大多数时候你不需要使用它。

瓦尔

只是一个语法糖,每当你使用var时,变量类型将根据分配给它的值在编译时决定。

动态

来自.net的DLR部分,当您想要使用非强类型输入时,您将只需要它。

以下是System.Object,dynamic和var之间的区别。

.net中的所有内容都是从System.Object类型派生的。 但如果你寻找具体的差异,这里就是他们。

对象与动态之间的区别。

1.您不能隐式地将Object类型的变量强制转换为任何其他类型。 编译器不会让你这样做。 另一方面,您可以隐式地将任何类型转换为动态。 编译器不会抱怨,因为在运行时和exception期间将执行转换,如果需要,将在运行时引发。 2.因为dynamic与object相同,所以你不能编写参数中Object和dynamic不同的重载方法。

动态和变量之间的差异。

1.将局部变量解释为动态或var仅具有语法差异。 2.如果不初始化变量,则无法声明var类型的变量,但是可以对动态变量3执行此操作。不能使用var变量作为方法参数传递或从方法返回。 4.您不能将表达式转换为var,但可以为动态变量执行此操作。

编译器说var是用于变量声明的上下文关键字。 这就是为什么我们需要在声明时分配一个值。 编译器然后检查他们的数据类型并以相同的方式对待它。 通过这种方式,编译器可以了解该变量的所有内容并暗示其类型安全性。

Object,Var和Dynamic类型之间差异的总结。 如果您不理解每个表行单元格中的概念,请将其引用到其他位置。 资料来源: https : //www.dotnettricks.com/learn/csharp/differences-between-object-var-and-dynamic-type

在此处输入图像描述