好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Dynamic和Var的区别及dynamic使用详解

C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的。var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值,而dynamic则可以不提供,它是在运行时才确定类型。

1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。

2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数。

3.表达式不能转型为var,但能转型为dynamic。

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

由于dynamic在运行时才检查类型,所以有时候会出现错误,因此使用它必须得法,那么何时使用它比较方便呢?我们先定义一个Person类,然后用反射进行动态调用起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!" });

  在反射的时候,传统的方法的方法调用往往比较繁琐,而用dyanmic则非常简化,而且直观:

?

dynamic obj = Activator.CreateInstance(t, null );

obj.Talk( "hell world!" );


  因此,dynamic只要使用得法,还是一个C#一个非常好的特征。

最后给大家总结以下:

常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做 比较。var实际上是编译期抛给我们的[语法糖],一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个 object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

这从visual studio的编辑器窗口就能看出来。以var声明的变量,支持[智能感知],因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持[智能感知],因为编译器对其运行期的类型一无所知。对 dynamic变量使用[智能感知],会提示[此操作将在运行时解析]。

dy("nrwz");

查看更多关于Dynamic和Var的区别及dynamic使用详解的详细内容...

  阅读:83次