var 和 dynamic 都是用于声明变量的关键字,但它们有着本质上的区别。var在编译时确定类型,dynamic是在运行时确定类型。
var关键字
是一种编译时类型推断的方式。当你使用 var 声明一个变量时,编译器会根据赋值的类型来推断变量的实际类型。
var str1 = "123"; //str1是string类型
//对str1赋值int类型的数据,编辑器会报错。
str1 = 0; //提示错误:Cannot convert source type 'int' to target type 'string' (无法将int类型转换为string类型)
使用ILSpy工具查看
var str1 = "123";
编译后的结果:
dynamic关键字
是一种运行时类型推断的方式。当你使用 dynamic 声明一个变量时,编译器不会对其进行类型检查,而是在运行时确定其类型。 如果将不同的类型的值分配给danamic变量,在编译时不会报错,但是运行时可能会有异常。
dynamic str2 = "abc";//运行到这一行,str2为string类型。
str2 = 1.2f;//运行到这一行,str2为float类型。
使用ILSpy工具查看上述代码 编译后的结果:
在编译时会将dynamic类型的变量编译为Object类型。当赋值值类型时会有装箱操作。
性能比较
由于 var 在编译时就确定了类型,因此它的性能要优于 dynamic。dynamic 在运行时需要进行类型检查和转换,这会带来额外的开销 。
使用场景
var: 适用于在编译时就能确定类型的情况,尤其是在类型明确的情况下使用 var 可以提高代码的可读性和性能。
dynamic: 适用于需要在运行时确定类型的情况,特别是在与动态语言交互或处理未知类型时使用 dynamic 可以简化代码。