.NET Var与Dynamic 隐式类型 静态类型 动态类型

本文详细介绍了C#中的var与dynamic关键字的区别与应用场景,包括它们的类型确定时机、初始化要求、IntelliSense支持及使用限制等。此外还探讨了它们在数组创建、赋值操作及反射调用等方面的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量的类型的确定是在编译时确定的 静态类型
变量的类型的确定是在执行是才确定的 动态类型

C#编译器做的工作只是完成检查语法是否正确,但无法确定所调用的方法或属性是否正确(之所以会这样,主要还是
因为动态类型是运行时才知道它的具体类型,所以编译器编译的时候肯定不知道类型,就没办法判断调用的方法或属性是
不是存在和正确了,所以对于动态类型,将不能使
用VS提供的智能提示的
功能,这样写动态类型代码时就要求开发人员
对于某个动态类型必须准确知道其类型后和所具有的方法和属性了,不能这些错误只能在运行程序的过程抛出异常的方式
被程序员所发现。)

C# var关键字
隐式类型使用限制:

a) 隐式类型只能应用于方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员。

b) 使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。

var 是3.5新出的一个定义变量的类型:隐式类型;它可用来定义隐式类型的局部变量,VAR可代替任何类型。

C#中关键字var和dynamic的区别是什么?

1、声明的变量

关键字var是在C#3.0中引入的,声明的变量是静态类型的,变量的类型由编译器在编译时决定。

关键字dynamic是在C#4.0中引入的,声明的变量是动态类型的,变量的类型由编译器在运行时决定。

2、初始化

关键字var声明的变量应在声明时初始化,这样编译器就会根据初始化的值来决定变量的类型。如果变量未初始化,则抛出错误。

关键字dynamic声明的变量在声明时不需要初始化此类型的变量,因为编译器在编译时不知道变量的类型。如果变量未初始化,也不会抛出错误。

3、intelliSense的支持

关键字var支持visual studio中的intelliSense。关键字dynamic不支持visual studio中的intelliSense

4、应用

关键字var不能用于属性或从函数返回值。它只能用作函数中的局部变量。

关键字dynamic可以用于属性或函数返回值。

任意数据类型都可以隐式转换成dynamic,反之亦然。 所以不存在拆箱和装箱

var 关键字不过是一个指令,它告诉编译器根据变量的初始化表达式来推断类型。(记住var并不是类型),而C# 4中引入的dynamic是类型,但是编译时不属于CLR类型(指的int,string,bool,double等类型,运行时肯定CLR类型中一种的),它是包含了System.Dynamic.DynamicAttribute特性的System.Object类型,但与object又不一样,不一样主要体现在动态类型不会在编译时执行显式转换

1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。

2.var只能用于声明方法内部的局部变量,不能用于字段,参数,
声明的同时必须初始化;初始化时类型就已经确定了,并且不能再被赋值不能进行隐式类型转换的类型的数据;编译时编译器会对var定义的变量进行类型推断,这时变量的类型已经确定.
而dynamic可用于局部变量,字段,参数。
dynamic可用于类型的字段,方法参数,方法返回值,可用于泛型的类型参数等;可以赋值给或被赋值任何类型并且不需要显式的强制类型转换,因为这些是运行时执行的,这要得益于dynamic类型的动态特性.

3.表达式不能转型为var,但能转型为dynamic。

4.必须显式初始化用var声明的变量,但无需初始化用dynam声明的变量。

var表示“变量的类型是在编译时决定的”,但是dynamic表示“变量的类型是在运行时决定的”。
因此,dynamic与var具有截然不同的含义。
  var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型。
dynamic更厉害,它告诉编译器,根本就别理究竟是啥类型,运行时再推断不迟。

var只能用于局部变量的定义,你不能把类的属性定义成 var,
也不能把方法的返回值类型或者是参数类型定义成var。dynamic就没有这些局限了。

dynamic类型并没有跳过类型校验,
只是延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。

如 dynamic i=9; int j=i+8;在运行的结果是17而object i=9;int j=i+8在运行时就会报错。原因object没有做类型转换。
上文已经说过object只是所有类型的父类。而dynamic不需要类型转换的原因是dynamic跳过编译类型检查。
什么时候使用dynamic或ob

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值