1.前言

C# 中存在三种形式的类型声明字段,使得字段可以接受多种类型的数据,它们分别是 var,object 以及 dynamic。下面的内容将对这三种的差异进行讲解分析。

首先,由于 C# 是强类型语言,所以编译器会在编译期间就会执行类型检查。

2.var

在一般情况下,定义特定类型时使用的是显式类型的声明,如:

string str = "asdf";

以上代码显式地将字符串 "asdf" 声明为 string 类型。

而使用 var 进行类型声明时,进行的是隐式类型的声明,如:

var str = "asdf";

当编译器在进行编译时,编译器将会为字段 str 创建最为适当的类型(即已确定类型),一旦通过编译,则 str 的类型就不能在发生改变。如以下操作将会报错:

var str = "asdf";
// str = 123;// Error: Cannot implicitly convert type 'int' to 'string' 

使用var定义变量时有以下四个特点:

  1. 必须在定义时初始化。也就是必须是 var s = “abcd” 形式,而不能是如下形式: var s; s = “abcd”;
  2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值。
  3. var 只能声明局部变量,for 语句,foreach 语句,using 域。
  4. 使用 var 定义变量和 object 不同,它在效率上和使用强类型方式定义变量完全一样。

对于像 int、double、string 等简单数据类型,我们最好使用特定的数据类型来声明变量,以免让事情变得复杂。但当创建了一个很大的类,那么为了方便创建对象,最好使用 var 关键字。还有一种约定俗成的习惯,当我们使用 LINQ 或 Anonymous 类型时,必须使用 var 关键字。

3.object

object 类型在 .NET Framework 中是 Object 的别名。在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Objetc 继承的, object 的实质是引用类型。可以将任何类型的值赋给 object 类型的变量。将值类型的变量转换为对象的过程称为“装箱”。将对象类型的变量转换为值类型的过程称为“拆箱”。

object 类型的简单声明如下:

object a = "asdf";
a = 123;

4.dynamic

dynamic 声明的类型编译时不进行类型检查,而是在运行时执行类型检查,其声明示例如下:

dynamic d = "asdf";d++;

在对以上代码进行编译时,编译器不会报错,但当执行该代码时,编译器将会报错"Operator '++' cannot be applied to operand of type 'string"。

dynamic 被编译后是一个 Object 类型,编译器编译时不会对 dynamic 进行类型检查。

转载于:https://www.cnblogs.com/jizhiqiliao/p/9811362.html

var,object和dynamic相关推荐

  1. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1;object b = 1; dynamic c = ...

  2. 【Flutter】Dart 数据类型 ( var 数据类型 | Object 数据类型 )

    文章目录 一. var 数据类型 二. var 数据类型不能被改变 三. Object 类型 四. 完整代码示例 五. 相关资源 Dart 语言中有 dynamic , var , Object , ...

  3. 了解 C# “.NET研究”4 中的 Dynamic 关键字

    dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能. 这些功能在宣布时就引起了人们的极大兴趣,并伴随着许多疑问 ...

  4. 【Flutter】Dart 数据类型 ( dynamic 数据类型 )

    文章目录 一. dynamic 数据类型 二. dynamic 变量无法进行语法检查 三. dynamic 变量运行时类型修改 四. 完整代码示例 五. 相关资源 Dart 语言中有 dynamic ...

  5. 理解C# 4 dynamic(4) – 让人惊艳的Clay

    一,多种方式初始化对象 1, 最简单的对象构建和初始化 dynamic New = new ClayFactory();var person = New.Person(); person.FirstN ...

  6. 理解C# 4 dynamic(3) – DynamicObject的使用

    上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了xpandoObject的基本使用.但ExpandoObject的问题就是它是一个万金油 ...

  7. 理解C# 4 dynamic(2) – ExpandoObject的使用

    ExpandoObject的使用非常简单,很容易入手.上一篇里面已经有详细的介绍了,可以看这里 (理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynami ...

  8. [2017-08-25]100行CSharp代码利用dynamic写个DSL(特定领域语言)

    最近看<CLR via C#(第4版)> 读到第五章末尾dynamic基元类型时,看了下作者的一个利用dynamic动态调用string类型的Contains方法(静态方法)的实现,突然发 ...

  9. C#编程总结(十四)dynamic

    http://www.cnblogs.com/yank/p/4177619.html C#编程总结(十四)dynamic 介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型 ...

最新文章

  1. php 文件限速下载代码
  2. 史上最全DSO学习资料
  3. html 颜色叠加图片,如何在背景图片上添加颜色叠加?
  4. 比Spring简单的IoC容器
  5. 会签是什么意思_后宫为什么要争宠·六
  6. u8 和 char如何转化_如何编写高效率稳定的单片机代码
  7. nssl1142,jzoj3487-剑与魔法【堆,贪心】
  8. Python---查找序列的最长递增子序列
  9. 论文学习5-NODE2BITS: Compact Time- and Attribute-aware Node Representations for User Stitching
  10. devops 开源_DevOps扩大您的开源凭证
  11. nginx程序访问linux任意目录,通过nginx访问linux目录
  12. 电脑上老出现万象预览的广告_电脑必备6款黑科技软件,让你的电脑更好用,千万别错过...
  13. ubuntu 17.10 如何设置合盖不关机
  14. AN5640摄像头模块在黑金开发板上的使用
  15. 《信任的速度》读后感
  16. java随机发扑克牌程序,java_扑克牌小程序
  17. 数字电子钟Multisim仿真(数电课设+实验报告)
  18. CTFhub备份文件下载
  19. 某直播APP逆向TCP协议分析
  20. DAY3-摸鱼-GG修改器的使用与装备代码的推算-勇士拯救计划

热门文章

  1. 哪个服务器比较稳定,云服务器哪个比较稳定
  2. C语言日期字符串减少两天,C语言第二天(字符串)
  3. function core.php is missing,PHP代码
  4. python识别复杂验证码2020_Python识别验证码!学会这步,百分之60的网站你基本都能识别了!...
  5. 20200710:动态规划复习day03
  6. android网格布局间距,android – 删除回收站视图网格布局中的默认间距
  7. python脱离依赖运行py文件_将一个python.py文件拆分为多个相互依赖的文件
  8. SCPPO(九):性能优化之停工装置按照开工装置更新价格
  9. 特斯拉扭亏,股价暴涨;马斯克下一步:进军打车业务
  10. 阿里芯片大动作!NPU明年6月发布,“平头哥”研发量子芯片