我已经阅读了大量关于c# v4附带的新关键字的文章,但我无法区分“dynamic”和“var”之间的区别。
这篇文章让我思考了一下,但我还是看不出有什么不同。
你是否只能将“var”用作局部变量,但同时用作局部变量和全局变量?
你能显示一些代码没有动态关键字,然后显示相同的代码与动态关键字吗?
我已经阅读了大量关于c# v4附带的新关键字的文章,但我无法区分“dynamic”和“var”之间的区别。
这篇文章让我思考了一下,但我还是看不出有什么不同。
你是否只能将“var”用作局部变量,但同时用作局部变量和全局变量?
你能显示一些代码没有动态关键字,然后显示相同的代码与动态关键字吗?
当前回答
Var(隐式类型局部变量)关键字用于定义局部变量。对于Var,底层数据类型是在编译时根据初始赋值确定的。一旦使用Var类型进行了初始赋值,那么它将成为强类型。如果您试图存储与Var类型不兼容的值,则会导致编译时错误。
例子:
Var strNameList=new List<string>(); By using this statement we can store list of names in the string format.
strNameList.add("Senthil");
strNameList.add("Vignesh");
strNameList.add(45); // This statement will cause the compile time error.
但在动态类型中,底层类型仅在运行时确定。在编译时不检查动态数据类型,也不是强类型。我们可以为动态类型分配任何初始值,然后可以在其生命周期内将其重新分配给任何新值。
例子:
dynamic test="Senthil";
Console.Writeline(test.GetType()) // System.String
test=1222;
Console.Writeline(test.GetType()) // System.Int32
test=new List<string>();
Console.Writeline(test.GetType()) //System.Collections.Generic.List'1[System.String]
它也不提供智能感知支持。当我们使用linq工作时,它也没有提供更好的支持。因为它不支持lambda表达式、扩展方法和匿名方法。
其他回答
我会解释dynamic和var的区别。
dynamic d1;
d1 = 1;
d1 = "http://mycodelogic.com";
这是可行的。编译器可以重新创建动态变量的类型。 首先,它创建类型为整数,然后编译器将重新创建类型为字符串,但在var的情况下
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
When using the ‘var’ keyword, the type is decided by the compiler at compile time, whereas when using the ‘dynamic’ keyword, the type is decided by the runtime. ‘var’ keyword, a strongly implicitly typed local variable for which the compiler is able to determine the type from the initialization expression - very useful when doing LINQ programming. Compiler doesn't have any information about the dynamic type of variable. so compiler will not show any intelligence .compiler has all information about the stored value of var type so compiler will show intelligence.dynamic type can be passed as function argument and function also can return object typeButvar type can not be passed as function argument and function can not return object type. This type of variable can work in the scope where it defined.
区别就在这里
var is statically typed (compile time), dynamic is dynamically typed (run time) A variable declared as var can only be used locally , dynamic variables can be passed in as params to function (function signature can define a param as dynamic but not var). with dynamic the resolution of the properties happens at runtime and thats not the case with var which means at compile time any variable declared as dynamic can call a method which may or maynot exist and so the compiler would not throw an error. Type casting with var not possible but with dynamic its possible (you can cast an object as dynamic but not as var).
阿伦Vijayraghavan
Do not confuse dynamic and var. Declaring a local variable using var is just a syntactical shortcut that has the compiler infer the specific data type from an expression. The var keyword can be used only for declaring local variables inside a method while the dynamic keyword can be used for local variables, fields, and arguments. You cannot cast an expression to var, but you can cast an expression to dynamic. You must explicitly initialize a variable declared using var while you do not have to initialize a variable declared with dynamic.
下面是一个简单的例子,演示了动态(4.0)和Var之间的差异
dynamic di = 20;
dynamic ds = "sadlfk";
var vi = 10;
var vsTemp= "sdklf";
Console.WriteLine(di.GetType().ToString()); //Prints System.Int32
Console.WriteLine(ds.GetType().ToString()); //Prints System.String
Console.WriteLine(vi.GetType().ToString()); //Prints System.Int32
Console.WriteLine(vsTemp.GetType().ToString()); //Prints System.String
**ds = 12;** //ds is treated as string until this stmt now assigning integer.
Console.WriteLine(ds.GetType().ToString()); **//Prints System.Int32**
**vs = 12**; //*Gives compile time error* - Here is the difference between Var and Dynamic. var is compile time bound variable.
湿婆Mamidi
动态变量和var变量都可以存储任何类型的值,但需要在声明时初始化'var'。
编译器没有关于变量的“动态”类型的任何信息。 Var是编译器安全的,即编译器拥有关于存储值的所有信息,因此它不会在运行时引起任何问题。
动态类型可以作为函数参数传递,函数也可以返回它。 Var类型不能作为函数参数传递,函数不能返回对象类型。这种类型的变量可以在其定义的范围内工作。
在动态类型转换的情况下,不需要,但你需要知道与存储类型相关的属性和方法,而对于var不需要类型转换,因为编译器有执行操作的所有信息。
dynamic:在使用反射或动态语言支持或COM对象编码时很有用,因为我们需要编写更少的代码。
var:在从linq查询中获取结果时有用。在3.5框架中引入了对linq特性的支持。
参考:咨询byabhi