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

 更新时间:2016年01月08日 15:45:23   作者:JackWang-CUMT  
C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的,下面通过本文给大家介绍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变量使用“智能感知”,会提示“此操作将在运行时解析”。

相关文章

  • C# Color.FromArgb()及系统颜色对照表一览

    C# Color.FromArgb()及系统颜色对照表一览

    这篇文章主要介绍了C# Color.FromArgb()及系统颜色对照表一览,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • WPF实现背景灯光随鼠标闪动效果

    WPF实现背景灯光随鼠标闪动效果

    这篇文章主要为大家详细介绍了WPF实现背景灯光随鼠标闪动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C#使用Stack<T>进行堆栈设计的实现

    C#使用Stack<T>进行堆栈设计的实现

    堆栈代表了一个后进先出的对象集合,当您需要对各项进行后进先出的访问时,则使用堆栈,本文主要介绍了C#使用Stack<T>类进行堆栈设计的实现,文中通过示例代码介绍的非常详细,感兴趣的可以了解一下
    2024-03-03
  • c#检测usb设备拨插类库USBClassLibrary分享

    c#检测usb设备拨插类库USBClassLibrary分享

    这篇文章主要介绍了c#检测usb设备拨插类库USBClassLibrary的简单示例,需要的朋友可以参考下
    2014-04-04
  • C#匿名委托和Java匿名局部内部类使用方法示例

    C#匿名委托和Java匿名局部内部类使用方法示例

    Java在嵌套类型这里提供的特性比较多,假设:Java的字节码只支持静态嵌套类,内部类、局部内部类和匿名局部内部类都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供的这种语法糖
    2013-11-11
  • C#实现字符串首字母大写的方法示例

    C#实现字符串首字母大写的方法示例

    这篇文章主要给大家介绍了关于利用C#实现字符串首字母大写的相关资料,这是在最近工作中遇到的一个需求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • C#12中的Collection expressions集合表达式语法糖详解

    C#12中的Collection expressions集合表达式语法糖详解

    C#12中引入了新的语法糖来创建常见的集合,并且可以使用..来解构集合,将其内联到另一个集合中,下面就跟随小编一起学习一下C#12中这些语法糖的使用吧
    2023-11-11
  • C# 如何在MVC3中取消备用控制器的选择

    C# 如何在MVC3中取消备用控制器的选择

    本篇文章介绍了,如何在MVC3中取消备用控制器的选择的详细分析。需要的朋友参考下
    2013-05-05
  • C#全局热键设置与窗体热键设置实例

    C#全局热键设置与窗体热键设置实例

    这篇文章主要介绍了C#全局热键设置与窗体热键设置实例,对C#全局热键设置与窗体热键设置的实现方法与具体代码进行了详细的介绍,需要的朋友可以参考下
    2014-10-10
  • 详解如何将.NET应用转换成Window服务

    详解如何将.NET应用转换成Window服务

    这篇文章主要为大家详细介绍了如何将.NET8.0应用程序转换成Windows服务,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论