《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(一)》
来源:互联网 发布:pid控制算法和图解 编辑:程序博客网 时间:2024/05/16 05:42
在讲类型推理之前,首先得讲一下几个概念:
1、早期绑定:如果在申明变量的时候显式的申明了类型,那么在将对象分配给对象变量时,Visual Basic 编译器会执行一个名为 binding 的进程,将对象分配给声明为特定对象类型的变量,则该对象为“早期绑定”。 早期绑定对象允许编译器在应用程序执行前分配内存以及执行其他优化。
例如:`dim strTest as string ’定义一个类型为string的变量`,此时是显示申明,也就是早期绑定。
2、后期绑定:其实就是前面说的咱们在申明一个变量时不指定类型,vb.net中默认是object类型(它是一种引用类型,这个里面可以存放任何类型的引用,包括值类型的数据的引用。)此时我们说这个变量属于后期绑定。简单来说,就是在程序运行前指定数据类型叫前期绑定,运行过程中动态指定类型就是后期的绑定。从上可知,虽然,定义的初期没有给出类型,程序也能运行。但是效率很低,因为这个涉及到数据类型的后期绑定问题,后期绑定变量中的所有数据都必须包装为类型 Object,在运行时访问该类型的成员,会使得程序运行较慢。
3、强类型:为所有变量指定具体的数据类型就称之为强类型。(注意:object也是一种具体的类型,它是vb.net中的默认类型)
接下来看什么是“类型推理”:
官方的解释: 类型推理是指编译器将通过初始化表达式的类型推断出变量类型的过程。
我个人的理解:就是不申明变量的类型,编译器将通过自己的规则去推理判断你需要的是何种类型数据。并将变量设置成强类型,也就是为你指定一种具体的数据类型。
类型推理其实很像前面讲到的后期绑定,因为你这里也没有指定变量的数据类型。但是和后期绑定不一样的地方的是:我们的编译器会在编译时(而非运行时)生成早期绑定代码
光说不练也是假把式:直接上Demo(准备工作,首先新建一个项目,添加2个类,分别是ClassA,ClassB)
具体代码如下:
Public Class ClassA Public Sub GetTypeByInference() Dim b As New ClassB Dim UnKnowType = b.TypeInference End SubEnd Class
Public Class ClassB Public Function TypeInference() As Integer End Function Public Function TypeInference2() As String End Function Public Function TypeInference3() As Decimal End FunctionEnd Class
此时,我们调用的是对象b的TypeInference方法,该方法的返回值是Integer。
你把光标移动到UnKnownType这个未定义任何类型的变量上,你就发现下面的效果。
下面,咱们接着试验,我们调用一下b的TypeInference2方法,该方法的返回值是string类型,看是什么效果。
从上面两个图片中效果我们可以看出来,我们的编译器非常聪明的根据方法的返回值类型判断出了变量的类型,并进行了类型的绑定(前期绑定)。
下面咱们想个办法稍微动一下手脚,让他看傻眼……
预知试验情况如何,请看下篇博客《从LRS项目中来看“数据类型”——第二话,类型推理(二)》
- 《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(一)》
- 《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(二)》
- 《从LRS项目重构来看“数据类型”——(第一话)DataTable转换泛型集合出现的类型冲突》
- 《从LRS项目重构来看‘泛型’(一)——追根寻源,看C++中的模板技术简介》
- 《LRS项目重构来看"泛型"(二)——异曲同工,泛型过程和C++函数模板的比较》
- 《从LRS项目来看”泛型“(三)——刨根问底,泛型工作原理》
- 《从LRS项目重构看如何做UI设计——组合查询的界面创意设计(一)》
- 《从LRS项目重构看“泛型”(四)——代码实战,将DataTable转成泛型实体集合》
- Docker实战系列——第二话--docker仓库管理(一)--工具的选型
- 【DirectX 9.0学习之路(第二话)】——Direct3D初始化(下)
- 软件工程(哈工大视频)第二话——软件与软件危机
- Docker实战系列——第二话--docker仓库管理(二)--玩转Harbor
- 曾哥传(第二话 村长的神器)
- Material Design风 第二话(CollapsingToolbarLayout+AppBarLayout+NestedScrollView)
- PG的数据类型(一)——数组类型
- 从 FingBugs的错误来看JAVA代码质量(一)
- 从 FingBugs的错误来看JAVA代码质量(一)
- 从一个最简单的例子来看Retrofit(一)
- 集合Map笔记
- 腐蚀膨胀
- CSU1620: A Cure for the Common Code(KMP+区间DP)
- 集合,Set实现类笔记
- 黑马程序员---java集合与框架
- 《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(一)》
- 11个让你吃惊的 Linux 终端命令(转自51cto)
- CSU1626: Time Warp
- 集合,List实现,泛型笔记
- 开源系统日志 log4cplus(转载)
- super继承和普通父类继承
- 集合笔记
- 类别 category VS 类扩展 extension
- 模拟异步方式上传文件