动态(C#4)和var之间有什么区别?

我已经阅读了大量关于将随C#v4发布的新关键字的文章,但我无法弄清楚“动态”和“变种”之间的区别。

这篇文章让我想起了它,但我仍然看不出有什么不同。

难道你可以只使用“var”作为局部变量,但是本地变量和全局变量都是可变的?

对于我的无知,我感到抱歉,但是您能否显示一些没有动态关键字的代码,然后使用动态关键字显示相同的代码?


var是静态类型 - 编译器和运行时知道类型 - 它们只是为您节省一些键入...以下是100%相同的:

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

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

发生的一切就是编译器发现s必须是一个字符串(来自初始化程序)。 在这两种情况下,它都知道(在IL中) s.Length是指(实例) string.Length属性。

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

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

这里, s被输入为动态 。 它不知道string.Length ,因为它在编译时并不知道s 任何内容。 例如,以下内容可以编译(但不能运行):

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

在运行时(仅),它会检查FlibbleBananaSnowball属性 - 无法找到它,并在一阵火花中爆炸。

通过dynamic ,属性/方法/操作员/等可以在运行时根据实际对象进行解析。 与COM(可以只有运行时属性),DLR或其他动态系统(如javascript )交谈非常方便。


var声明的变量是隐式的,但是是静态类型的。 动态声明的变量是动态输入的。 此功能已添加到CLR中,以支持Ruby和Python等动态语言。

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


我将解释动态var之间的区别。

dynamic d1;
d1 = 1;
d1 = "http://mycodelogic.com";

这将工作。 编译器可以重新创建动态变量的类型。
首先它创建类型为整型 ,然后编译器将重新创建类型为字符串
但在变种的情况下

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 


当使用' var '关键字时,类型由编译器在编译时决定,而当使用' dynamic '关键字时,类型由运行时决定。
' var '关键字是一种强烈隐含类型的局部变量,编译器可以通过它初始化表达式来确定类型 - 在进行LINQ编程时非常有用。
编译器没有关于变量的动态类型的任何信息。 所以编译器不会显示任何智能。
编译器拥有关于var类型存储值的所有信息,因此编译器将显示智能。
动态类型可以作为函数参数传递,函数也可以返回对象类型

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

链接地址: http://www.djcxy.com/p/95963.html

上一篇: What's the difference between dynamic(C# 4) and var?

下一篇: Create WPF TextBox that accepts only numbers