var lady first
C# 中的隐式类型的局部变量是为了支持匿名类型而出现的,并且也是为了解决一部分查询操作返回的结果是 IQueryable 类型,而另一部分查询返回的结果是 IEnumerable 类型导致的把 IQueryable 当作 IEnumerable 来使用,进而无法使用 IQueryProvider 提供的增强功能。在这里一定会有读者担心如果没有把变量的类型写明是不是会造成类型安全问题。那么,在这里我要告诉各位读者的是开发人员有没有写明变量类型与变量的类型安全毫无关系,所以大家不必担心。在大部分情况下使用 var 声明隐式类型的变量,编译器会自动选择合适的类型来处理。看到这里,一定会有读者说既然有明确的类型,为什么不指定明确的类型呢,而且使用隐式变量也会容易让其他开发人员搞不清楚变量的类型。那么我现在就给大家解答一下。
首先,使用明确的类型有可能会造成代码的执行顺序改变,这一点我将在后面的文章中具体讲解。其次,这就是一个编码命名习惯问题了,我们在 new 一个对象时可以通过等号右边的类型得知变量的类型。例如:
var s = new Student();
从上面的代码中我们可以看出变量 s 的类型是 Student ,但是这段代码还有一个问题,就是变量的命名。s 这个名字混在大量的代码中很难一眼看出它的类型。这时我们将变量名改为 student 就很容易看出变量类型了。这个变量命名规则一定要记住,这条规则可以说是你牢记于心的。这种错误并不只是开发新手会犯的,我在实际工作和项目中就见过一些所谓的技术大牛出现这种错误,最后自己都不知道自己命名的这变量是干嘛的,是什么类型。 [笑哭] 一些有经验的开发人员往往会对新手开发人员说不要使用匿名类型,因为它会影响性能影响静态类型检查。那么,我在这里要说的是这完全都是在胡扯!首先局部变量类型推断不等于动态类型检查,var 声明的变量不是动态变量,c# 会根据赋值符号等号右边的值的类型来确定等号左边的变量类型。其次,编译器会自动判断类型。这里我需要强调的是隐式类型变量的真实类型是由方法的签名决定的,也就是说不管这个隐式类型的真实类型是从某个类继承的类还是实现了一个或多个接口的类,只要没有明确执行类型转换,编译器都会根据方法的签名来决定隐式类型的真实类型。
上面我们说了隐式类型的优点,那么我们再来说一下隐式类型的缺点。首先 var 声明的变量会让代码阅读起来有些困难,因为有可能我们所认为的类型和编译器最终的类型不一样,进而导致在代码中错误的维护开发导致 bug 。这是因为 var 声明的变量编译器会自动推断其类型,但是开发人员看不到推断出来的类型。其次,如果使用隐式类型的变量的真实类型是内置的数值类型的话会产生类型转换精度下降的问题。这个问题只会发生在窄转换中,例如 long 向 int 转换。这个问题并不是编译器问题,而是因为编译器会自己设定变量的类型,也就是说根据赋值符号等号右侧的部分做出的最佳选择。
Tip: 这里指的隐式类型变量是指局部变量
- 零基础学编程031:Python与其它语言最不同的一条语法规则
- dedecms批量导出新增文章url和标题
- 明理知意:复合索引优化及索引访问原理
- WCF配置文件与文件下载之坎坷路
- 零基础学编程030:像黑客般玩玩字符艺术
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
- 零基础学编程029:程序员作图不用笔
- 零基础学编程028:面向对象编程OOP
- 如何修改帝国cms文章点击量默认值和成倍增加
- 深入内核:监听器的工作原理与故障诊断分析
- 零基础学编程027:站在巨人的肩膀上
- 群分享:Markdown + CSS 实现微信公众号排版
- Android 蓝牙操作详解
- Linq to xml 操作带命名空间的xml
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kubernetes 故障解决心得(一)
- Kubernetes 临时存储需要限制吗?
- PHP安全:变量的前世今生
- 如何使用ParamSpider在Web文档中搜索敏感参数
- Spring 的 Controller 是单例还是多例?怎么保证并发的安全
- 《剑指offer》第28天:最长上升子序列(高频)
- 《剑指offer》第27天:三角形最小路径和
- 《剑指offer》第26天:最大子序和
- Threat Dragon:一款针对OWASP的威胁模型构建平台
- 《剑指offer》第25天:最简单的动态规划
- 基于web页面开发串口程序界面---html代码
- Debotnet:一款针对Windows10隐私设置和数据的保护工具
- 基于web页面开发串口程序界面---代码实现
- 《剑指offer》第24天:链表相加
- 《剑指offer》第23天:删除链表倒数第N个节点