我已经阅读了大量关于c# v4附带的新关键字的文章,但我无法区分“dynamic”和“var”之间的区别。

这篇文章让我思考了一下,但我还是看不出有什么不同。

你是否只能将“var”用作局部变量,但同时用作局部变量和全局变量?

你能显示一些代码没有动态关键字,然后显示相同的代码与动态关键字吗?


当前回答

一个很大的不同——你可以有一个动态返回类型。

dynamic Foo(int x)
{
    dynamic result;

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

    return result;
}

其他回答

用var声明的变量的类型是由编译器决定的,它是指定类型名称的快捷方式,仅此而已。

然而动态是在运行时确定的,编译器不知道实际的类型,所有对该变量的方法/字段/属性访问都将在运行时计算出来。

Var和dynamic定义类型。 Var在编译时,而dynamic在运行时。 在var声明和初始化中,两者都是强制性的,就像常量变量while一样 在动态初始化可以在运行时像只读变量。 在var类型中,无论什么类型都是在初始化时确定的,但不能更改下一步 动态可以采用任何类型,甚至用户定义的数据类型。

动态变量和var变量都可以存储任何类型的值,但需要在声明时初始化'var'。

编译器没有关于变量的“动态”类型的任何信息。 Var是编译器安全的,即编译器拥有关于存储值的所有信息,因此它不会在运行时引起任何问题。

动态类型可以作为函数参数传递,函数也可以返回它。 Var类型不能作为函数参数传递,函数不能返回对象类型。这种类型的变量可以在其定义的范围内工作。

在动态类型转换的情况下,不需要,但你需要知道与存储类型相关的属性和方法,而对于var不需要类型转换,因为编译器有执行操作的所有信息。

dynamic:在使用反射或动态语言支持或COM对象编码时很有用,因为我们需要编写更少的代码。

var:在从linq查询中获取结果时有用。在3.5框架中引入了对linq特性的支持。

参考:咨询byabhi

Var是静态类型的——编译器和运行时知道它的类型——它们只是为你节省了一些输入…以下是100%相同的:

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

and

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

所发生的一切只是编译器发现s必须是一个字符串(来自初始化式)。在这两种情况下,它都知道(在IL中)s.l end意味着(实例)字符串。长度属性。

动态是一种非常不同的野兽;它与object最相似,但具有动态调度:

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

这里,s的类型是动态的。它不知道字符串。长度,因为它在编译时不知道s的任何信息。例如,下面的代码也可以编译(但不能运行):

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

在运行时(仅),它将检查flibb黎巴嫩asnowball属性-未能找到它,并爆炸在一个火花淋浴。

使用dynamic,属性/方法/操作符等在运行时根据实际对象解析。非常方便地与COM(可以具有仅运行时属性)、DLR或其他动态系统(如javascript)通信。

用var声明的变量是隐式的,但是是静态类型的。使用dynamic声明的变量是动态类型的。CLR添加此功能是为了支持Ruby和Python等动态语言。

我应该补充一点,这意味着动态声明在运行时解析,var声明在编译时解析。