LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#里的var和dynamic区别到底是什么,你真的搞懂了嘛

admin
2023年6月17日 8:50 本文热度 447

前言

var和dynamic都是不确定的类型,但是这两个有本质上的不同。不同在哪儿呢?var编译阶段确定类型,dynamic运行时阶段确定类型。这种说法对不对呢?本篇看下。

概括

以下详细叙述下这两个(var,dynamic)上下文关键字的不同点。

1.例子

static void Main(string[] args)
{
var a = 0x10;
dynamic b = 0x10;
}

var其实在你设置它的变量a的值那一刻起,它的类型就确定了。这点你可以在VS里,在var上面查看定义,就可以看到。例子里面a的类型就是Int32。如果你把变量a赋值为字符串类型,那么它变量a的类型就是string。严格来说还没到编译阶段,在编译器VS里面就被识别了类型。

而dynamic则不同,它类似于public,static。无法查看其实际类型,但是这里注意了dynamic和var同称之为:上下文关键字(官方说法是在代码中提供特殊含义)。也就是说它们两个在C#里面严格来说都是关键字。只不过运作模式不同。

2.IL Code

.method private hidebysig static void  Main(string[] args) cil managed

{

  .locals init (int32 V_0, object V_1)

  IL_0000:  nop

  IL_0001:  ldc.i4.s 16

  IL_0003:  stloc.0

  IL_0004:  ldc.i4.s 16

  IL_0006:  box [System.Runtime]System.Int32

  IL_000b:  stloc.1

  IL_000c:  ret

} // end of method Program::Main

在IL里面,var的操作模式是:将0x10(十进制的16)推送到堆上,然后从堆里面取出来赋值给a。dynamic的操作模式是:将0x10推送到堆上,然后从堆上取出来作为参数传递给box函数。这里可以看到很明显的不同。当然IL依然不够。所以下面我们上JIT。

3.ASM Code

var a=0x10

00007FF9FC1A76DC  mov         dword ptr [rbp+3Ch],10h

dynamic b=0x10

00007FF9FC1A76E3  mov         rcx,7FF9FC10E8D0h

00007FF9FC1A76ED  call        CORINFO_HELP_NEWSFAST (07FFA5BCA0000h)

00007FF9FC1A76F2  mov         qword ptr [rbp+28h],rax

00007FF9FC1A76F6  mov         rax,qword ptr [rbp+28h]

00007FF9FC1A76FA  mov         dword ptr [rax+8],10h

00007FF9FC1A7701  mov         rax,qword ptr [rbp+28h]

00007FF9FC1A7705  mov         qword ptr [rbp+30h],rax

可以看到dynamic的code远比var的code夸张,而且性能也是成问题的。它这里调用了CORINFO_HELP_NEWSFAST实际上是进行了一个装箱,也就是IL的box,运行时里面的JIT_New。先放入堆,然后返回装箱后的对象,最后放入栈。这么看来,如果有性能需求,还是建议var,而慎用dynamic。

4.总结:
var和dynamic的不同点。
1.var被rosyln编译前就确定了类型,而dynamic的类型则是在CLR(这里更严格点应该说是在JIT的IR)里面确定。
2.var只是一个简单的值,而dynamic则被实例化成了一个对象,它的变量值是它对象的字段
3.var的性能远远大于dynamic的性能。


该文章在 2023/6/17 8:56:36 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved