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

作者:JackWang-CUMT 时间:2022-09-22 13:18:23 

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

标签:dynamic,var
0
投稿

猜你喜欢

  • 详细了解C语言二叉树的建立与遍历

    2021-08-17 10:24:01
  • Centos中安装jdk案例讲解

    2023-04-30 00:37:50
  • VsCode搭建Java开发环境的方法

    2023-06-17 13:29:19
  • java 读写文件[多种方法]

    2022-10-04 09:09:00
  • Java线程的生命周期和状态控制_动力节点Java学院整理

    2022-01-25 17:01:42
  • C# 16进制与字符串、字节数组之间的转换

    2021-07-13 08:08:10
  • 详解WPF中的APP生命周期以及全局异常捕获

    2022-12-10 11:54:27
  • java web实现邮箱激活与忘记密码

    2023-11-18 09:35:26
  • APK程序获取system权限的方法

    2023-09-05 06:41:49
  • C#操作DataGridView获取或设置当前单元格的内容

    2022-04-01 14:44:25
  • Feign远程调用Multipartfile参数处理

    2022-09-22 02:46:24
  • java实现员工工资管理系统

    2023-09-22 15:37:24
  • C#中委托的+=和-=深入研究

    2023-05-31 01:00:15
  • Android 利用ViewPager+GridView实现首页导航栏布局分页效果

    2021-08-05 09:39:07
  • java实现在线预览--poi实现word、excel、ppt转html的方法

    2022-09-29 20:29:41
  • Springboot详解实现食品仓库管理系统流程

    2023-11-10 18:33:15
  • 深入解析Spring Cloud内置的Zuul过滤器

    2022-05-16 12:49:04
  • Java发送post方法详解

    2023-10-28 03:55:00
  • Android控件Tween动画(补间动画)实现方法示例

    2021-12-31 17:46:39
  • Java将对象保存到文件中/从文件中读取对象的方法

    2022-06-18 21:26:42
  • asp之家 软件编程 m.aspxhome.com