Object,Dynamic和Var之间的区别

时间:2014-01-12 21:12:30

标签: c# object dynamic var

我需要了解C#中这三个关键字ObjectDynamicvar之间的区别。

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

请问您能解释一下这些关键字之间的区别吗?每个关键字的效用是什么?

9 个答案:

答案 0 :(得分:43)

对象:

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

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

Var:

它是编译时变量,不需要装箱和拆箱。由于Var是编译时功能,因此所有类型检查仅在编译时完成。 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
}

动态:

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

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

答案 1 :(得分:29)

一切都是Object这是基本类型。每一种类型都会暂时从Object继承,一个简单的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

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

答案 2 :(得分:13)

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

var number = 123;

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

var number;
number = 123;

如果您使用var关键字,则必须为变量指定内容,以便确定类型。

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

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

这是有效的,因为当您执行此操作boxing/unboxing时会自动执行此操作。与var关键字相反,您可以像这样使用object

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

3)dynamicC# 4.0附带的一个很酷的功能,如果您在编译时不知道函数返回类型,则可以使用dynamic。您的类型将是在run-time中确定。因此,您不能将智能感知用于动态变量。

您可以像这样使用动态:

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

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

我要提及的最后一件事,dynamicobject可以是参数类型,但var不能。例如,您可以这样做:

public void SomeMethod(dynamic arg1)

但你不能这样做:

public void SomeMethod(var arg1)

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

答案 3 :(得分:7)

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

如果您不想写var,而是写string x = "a",则

var x = "a"用作快捷方式。它只有在编译器能够弄清楚你的意思时才有效。

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

答案 4 :(得分:7)

这很简单......

对象是.NET中的基本类型。所有其他类型都继承自它。所以对象类型的变量可以包含所有内容。但是,只有在没有其他选择的情况下才应该这样做,原因如下:

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

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

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

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

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

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

答案 5 :(得分:4)

以下是System.Object,dynamic和var。

之间的区别

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

对象和动态之间的区别。

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

dynamic和var之间的区别。

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

答案 6 :(得分:3)

对象

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

Var

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

动态

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

答案 7 :(得分:2)

总结一下Object,Var和Dynamic类型之间的区别。如果您不了解每个表格行单元格中的概念,请在其他地方引用它。来源:https://www.dotnettricks.com/learn/csharp/differences-between-object-var-and-dynamic-type

Image showing the comparison among Object, Var and Dynamic

答案 8 :(得分:1)

编译器说var是用于变量声明的上下文关键字。这就是为什么我们需要在声明时分配一个值。然后,编译器检查其数据类型,并以相同的方式处理它。这样,编译器就知道有关该变量的所有信息,并暗含了对该类型的安全性。

相关问题