• .NET Var与Dynamic


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

    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或object根据情况个人决定。个人觉得由于dynamic不需要类型转换不会造成有些类型转换的精度丢失。
    所以应dynamic比较安全。

    var,dynamic,传统确定类型的效率对比
    传统类型的效率>=var动态类型>dynamic动态类型

    常有人会拿var和dynamic作比较,实际上,var和dynamic完全是两个概念,根本不应该放在一起比较.var实际上是编译期抛给我们的”语法糖”,一旦被编译,编译期会自动匹配var变量的实际类型,并用实际类型来替换该变量的声明,这看上去就好像我们在编码的时候用实际类型进行声明的.而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期.
    dynamic可以简化反射.
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    不能用var来声明方法中的参数类型

    // 隐式类型的优点
    // 对于复杂类型,减少打字量
    // 使用隐式类型,此时就不需要再赋值的左右两侧都指定Dictionary
    var dictionary = new Dictionary();

    // 在foreach中使用隐式类型
    foreach (var item in dictionary)
    {
    //
    }
    // 隐式类型的缺点
    // 下面代码使用隐式类型就会使得开发人员很难知道变量的具体类型
    // 所以对于什么情况下使用隐式类型,完全取决个人情况,自己感觉是否使用了隐式类型会使代码看起来更整洁和容易理

    var a = 2147483649;
    var b = 928888888888;
    var c = 2147483644;
    Console.WriteLine( “变量a的类型为:{0}”,a.GetType());
    Console.WriteLine(“变量b的类型为:{0}”, b.GetType());
    Console.WriteLine(“变量c的类型为:{0}”, c.GetType());
    Console.Read()

    隐式类型的数组
    var不仅可以创建隐式类型的局部变量,还可以创建数组,下面是一段演示代码
    // 隐式类型数组演示
    // 编译器推断为int[]类型
    var intarray = new[] { 1,2,3,4};
    // 编译器推断为string[] 类型
    var stringarray = new[] { “hello”, “learning hard” };
    // 隐式类型数组出错的情况
    var errorarray = new[] { “hello”, 3 };
    使用隐式类型的数组时,编译器必须推断出使用什么类型的数组,编译器首先会构造一个包含大括号里面的所有表达式(如上
    面代码中的 1,2,3,4和"hello",“learning hard”)的编译时类型的集合,在这个集合中如果所有类型都能隐式转换为唯一的一种
    类型,则该类型就成为数组的类型,否则,就会出现编译时错误,如代码中隐式类型数组出错的情况, 因为"hello"转化
    为string,而3却转化为int,此时编译器就不能确定数组的类型到底为什么,所以就会出现编译错误,错误信息为:“找不到隐式类
    型数组的最佳类型

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    浏览器是怎么执行JS的?——消息队列与事件循环
    南京邮电大学汇编语言程序设计实验二
    简单写个JS插件替换网页上的文本
    关于 Notion-Like 工具的反思和畅想
    Spring 中毒太深!离开 Spring 我居然连最基本的接口都不会写了。。。
    第5章 Kafka,构建TB级异步消息系统
    【自然语言处理(NLP)】基于PaddleHub的文本审核
    NewStarCTF2023week4-R通大残(RGB通道隐写)
    还在找PDF合并文件的方法?这就有3个实用方法
    minio使用案例(Springboot)
  • 原文地址:https://blog.csdn.net/u013400314/article/details/126579757