C#中很多关键字的用法很容易混淆,var和就是其中之一。 它们都可以声明动态类型变量,但本质上它们还是有很多区别。 var的类型在编译阶段就已经确定了。 初始化时必须提供初始化值,但也可以不提供。 类型是在运行时确定的。
1、var声明局部变量只是一种简化的语法,需要编译器根据表达式推断出具体的数据类型。
2.Var只能用于在方法内部声明局部变量,但可以用于局部变量、字段和参数。
3.表达式不能转换为var,但可以转换为.
4.用var声明的变量必须显式初始化,但用dynam声明的变量不需要初始化。
//var 在编译阶段已经确定类型 // var varError; var isIntType = ; isIntType.ToString(); //dynamic在编译期间不进行任何 //的类型检查,而是将类型检查放到 //了运行期 dynamic dyn = ; // dynamic dynOk; dyn = "hello world"; //error 字符串没有 [ fn不存在的方法 ] 的方法 //但在语法检查时通过,不会提示语法错误 var s = dyn.fn不存在的方法();//runtime error
由于类型是在运行时检查的,因此有时会发生错误,因此您必须明智地使用它。 那么什么时候使用比较方便呢? 我们首先定义一个类,然后使用反射动态调用Talk方法:
class Person { public void Talk(string msg) { MessageBox.Show(msg); } }
//dynamic 在反射时候可以简化代码 System.Type t = typeof(Person); var obj = Activator.CreateInstance(t, null); t.InvokeMember("Talk", System.Reflection.BindingFlags.InvokeMethod, null, obj, new object[] { "hell world!" });
在反射时,传统的方法调用往往很麻烦,但使用它们却非常简单和直观:
dynamic obj = Activator.CreateInstance(t, null); obj.Talk("hell world!");
因此,只要正确使用,它仍然是C#的一个非常好的特性。
最后我想总结以下几点:
人们经常将关键字 var 与 var 进行比较。 事实上,var和var是两个完全不同的概念,根本不应该放在一起比较。 Var实际上是编译时扔给我们的“语法糖”。 一旦编译完成,编译时会自动匹配var变量的实际类型,并将变量的声明替换为实际类型。 这看起来就像我们在编码时使用实际类型来声明的。 编译后,它实际上是一个类型,但编译器会对类型进行特殊处理,使其在编译时不进行任何类型检查,而是将类型检查放在运行时。
这可以从编辑器窗口中看到。 用 var 声明的变量支持“智能感知”,因为可以推断出 var 类型的实际类型,但用 var 声明的变量不支持“智能感知”,因为编译器对其运行时类型一无所知。 对变量使用 会提示“此操作将在运行时解析”。