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

 更新时间:2020年6月25日 11:25  点击:1539

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变量使用“智能感知”,会提示“此操作将在运行时解析”。

[!--infotagslink--]

相关文章

  • C#中var关键字用法分析

    这篇文章主要介绍了C#中var关键字用法,实例分析了C#中var关键字的应用场合,对于.NET的学习具有一定参考价值,需要的朋友可以参考下...2020-06-25
  • C#中 dynamic、Object和var之间的实际区别是什么?何时使用它们?

    dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。 什么是动态编程语言有时可以划分为静态类型化语言和动态类型化语言。C#和Java经常被认为是静...2020-05-11
  • C#中Dynamic和Dictionary性能比较

    开发中需要传递变参,考虑使用 dynamic 还是 Dictionary,dynamic 的编码体验显著优于 Dictionary,如果性能差距不大的话,我会选择使用dynamic。下面通过本文给大家详细介绍下C#中Dynamic和Dictionary性能比较,一起看看吧...2020-06-25
  • 浅析C# Dynamic关键字

    这篇文章主要介绍了C# Dynamic关键字的相关资料,文中讲解非常细致,对大家学习C# Dynamic关键字有所帮助,感兴趣的朋友可以了解下...2020-11-03
  • c#中var关键字用法浅谈

    这篇文章介绍了c#中var关键字用法,有需要的朋友可以参考一下...2020-06-25
  • C# 反射与dynamic最佳组合示例代码

    这篇文章主要介绍了C# 反射与dynamic最佳组合示例代码,需要的朋友可以参考下...2020-06-25
  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。下面通过本文给大家分享C# 匿名对象(匿名类型)、var、动态类型 dynamic,需要的的朋友参考下吧...2020-06-25
  • JDK10中的局部变量类型推断var

    这篇文章主要介绍了JDK10中的局部变量类型推断var,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-29
  • C#使用dynamic类型访问JObject对象

    这篇文章主要为大家详细介绍了C#使用dynamic类型访问JObject对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C#动态对象(dynamic)详解(实现方法和属性的动态)

    下面小编就为大家带来一篇C#动态对象(dynamic)详解(实现方法和属性的动态)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • c#中object、var和dynamic的区别小结

    这篇文章主要给大家介绍了关于c#中object、var和dynamic的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • c# dynamic的使用详解

    这篇文章主要介绍了c# dynamic的使用详解,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-04-30
  • C#中dynamic关键字的正确用法(推荐)

    dynamic的出现让C#具有了弱语言类型的特性。dynamic是FrameWork4.0的新特性。这篇文章主要介绍了C#中dynamic关键字的正确用法(推荐)的相关资料,需要的朋友可以参考下...2020-06-25
  • 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍

    本篇文章是对C# 4.0 新特性dynamic、可选参数、命名参数进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • c#使用dynamic类型优化反射的方法

    dynamic是FrameWork4.0的新特性,下面这篇文章主要给大家介绍了关于c#使用dynamic类型优化反射的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C# dynamic关键字的使用方法

    C# dynamic关键字的使用方法,需要的朋友可以参考一下...2020-06-25
  • 深入浅析C#中的var和dynamic

    这篇文章给大家介绍了C#中的var和dynamic的相关知识,var和dynamic的本质区别是类型判断的时间不同,前者是编译时,后者是运行时。具体内容详情大家通过本文学习下吧...2020-06-25
  • C# Dynamic关键字之:解析dynamic就是Object

    本篇文章是对C#中dynamic关键字就是Object进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • C# Dynamic关键字之:dynamic为什么比反射快的详解

    本篇文章是对C#中dynamic为什么比反射快进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 双向RNN:bidirectional_dynamic_rnn()函数的使用详解

    今天小编就为大家分享一篇双向RNN:bidirectional_dynamic_rnn()函数的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22