C#里的var和dynamic区别到底是什么,你真的搞懂了嘛
2023/6/16 14:23:55
本文主要是介绍C#里的var和dynamic区别到底是什么,你真的搞懂了嘛,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
这个var和dynamic都是不确定的初始化类型,但是这两个本质上的不同。不同在哪儿呢?var编译阶段确定类型,dynamic运行时阶段确定类型。这种说法对不对呢?本篇看下
概括
以下详细叙述下这两个(var,dynamic)上下文关键字的不同点。
1.例子
static void Main(string[] args) { var a = 0x10; dynamic b = 0x10; }
var其实在你设置它的变量a的值的那一刻起,它的类型就确定了。这点你可以在VS里,在var上面f12查看定义,就可以看到例子里面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。先传入参数,然后返回装箱后的对象地址也就是MethodTable,最后把0x10放入到&Methodtable+8地方。而var只是直接把0x10放入到栈。这么看来,如果有性能需求,还是建议var,而慎用dynamic。
4.总结:
var和dynamic的不同点。
1.var被rosyln编译前就确定了类型,而dynamic则是在CLR(这里更严格点应该说是在JIT)里面确定。
2.var只是一个简单的值,而dynamic则被实例化成了一个对象,它的变量值是它对象的字段
3.var的性能远远大于dynamic的性能。
结尾
作者:江湖评谈
欢迎关注我的公众号:江湖评谈(jianghupt),文章首发。
这篇关于C#里的var和dynamic区别到底是什么,你真的搞懂了嘛的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#