VB.net是怎样做到的(一、二)

VB.net是怎样做到的(一)

VB.net能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#同属.net的语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下。

首先是局部Static变量。VB支持用Static关键字声明局部变量,这样在过程结束的时候可以保持变量的数值:

Public Sub Test1()

Static i As Integer

i += 1 '实现一个过程调用计数器

End Sub

我们实现了一个简单的过程计数器。每调用一次Test,计数器的数值就增加1。其实还有很多情况我们希望保持变量的数值。而C#的static是不能用在过程内部的。因此要实现过程计数器,我们必须声明一个类级别的变量。这样做明显不如VB好。因为无法防止其他过程修改计数器变量。这就和对象封装一个道理,本来应该是一个方法的局部变量,现在我要被迫把它独立出来,显然是不好的设计。那么VB是怎么生成局部静态变量的呢?将上述代码返汇编,我们可以清楚地看到在VB生成的CIL中,i不是作为局部变量,而是作为类的Field出现的:

.field private specialname int32 $STATIC$Test1$2001$i

也就是说,i被改名作为一个类的字段,但被冠以specialname。在代码中试图访问$STATIC$Test1$2001$i是不可能的,因为它不是一个有效的标识符。但是在IL中,将这个变量加一的代码却与一般的类字段完全一样,是通过ldfld加载的。我觉得这个方法十分聪明,把静态变量变成生命周期一样的类字段,但是又由编译器来控制访问的权限,让它成为一个局部变量。同时也解释了VB为什么要用两个不同的关键字来声明静态变量——Static和Shared

VB.net是怎样做到的(二)

VB.net支持一项很有意思的功能——MyClass。大部分人使用MyClass可能仅限于调用本类其他构造函数时。其实MyClass可以产生一些很独特的用法。MyClass永远按类的成员为不可重写的状态进行调用,即当类的方法被重写后,用MyClass仍能得到自身的版本。下面这个例子和VB帮助中所举的例子非常相似

Public Class MyClassBase
Protected Overridable Sub Greeting()
Console.WriteLine("Hello form Base")
End Sub

Public Sub UseMe()
Me.Greeting()
End Sub

Public Sub UseMyClass()
MyClass.Greeting()
End Sub
End Class

Public Class MyClassSub
Inherits MyClassBase

Protected Overrides Sub Greeting()
Console.WriteLine("Hello form Sub")
End Sub
End Class

我们用一段代码来测试:

Dim o As MyClassBase = New MyClassSub()

o.UseMe()
o.UseMyClass()

结果是UseMe执行了子类的版本,而UseMyClass还是执行了基类本身的版本,尽管这是一个虚拟方法。观其IL,可以看到其简单的实现原理:

Me用的调用指令是callvirt

IL_0001: callvirt instance void App1.MyClassBase::Greeting()

而MyClass调用的是call

IL_0001: call instance void App1.MyClassBase::Greeting()

奇怪的是,如此简单的一个功能,我竟然无法用C#实现,C#怎样也不允许我按非虚函数的方式调用一个虚函数。C++可以用类名::方法名的方式访问自身版本的函数,但C#的类名只能用来访问静态的成员。这真是C#一个奇怪的缺陷。

时间: 2024-10-01 18:23:38

VB.net是怎样做到的(一、二)的相关文章

VB打造超酷个性化菜单(二)

菜单 VB打造超酷个性化菜单(二) 其实,漂亮的界面都是"画"出来的,菜单当然也不例外.既然是"画"出来的,就需要有窗体来接收"画"菜单这个消息,后面我们会看到,实际上不仅仅是"画"这个消息,一切关于这个菜单的消息都要有一个窗体来接收.如果你对消息不太了解,可以看看网上其它一些关于Windows消息机制的文章.不了解也没有关系,只要会使用就可以了,后面的文章给出了完整的源代码,而且文章的最后还给出了源代码的下载地址. 下面我们

VB.Net编程入门之Hello World(二)

编程 三.Visual Basic .Net开发利器Visual Studio .Net简介: 微软公司提供了四个不同的Visual Studio .Net版本,分别是:企业级结构设计版.企业级开发版.专业版和学院版.其中学院版主要是为在校大学生学习Visual Studio.Net准备的,它又分成三个独立的版本:Visual C#标准版.Visual Basic .Net标准版和Visual C++标准版.上述的每一个版本的价格都不菲.现在在市面上买到主要是7张CD碟片的Visual Stud

机房收费系统vb.net之打包与部署(二)

             紧接着上篇博客的打包和部署,下面说一下我在XP系统和.net framework2.0平台发布系统的解决办法,对于.net framework2.0的情况,因为大家知道如果用visual studio2013的话,最低的运行平台是2.0但是的代码是在4.5的平台下实现的,要是转换过去,会出很多错误,见下图:                       生成后的效果就是会出现很多的错误:                        原因就是我之前 敲代码的目标框架是默认

VB调用Matlab在WEDM仿真系统中的应用

基于BP神经网络的电火花线切割(WEDM)工艺仿真系统需要具有工艺数据库管理 .工艺效果预测.加工参数优化等设计功能.借助Matlab的神经网络工具箱,可 以建立良好的工艺效果预测模型和参数优化模型,这正是工艺仿真软件最主要的 功能要求.VB是Windows操作系统下优秀的可视化编程工具软件,在用户界面设计 和快速开发等方面具有独特的优势.同时,Matlab仿真软件以其强大的科学计算 功能和开放式开发思想使其成为当前最为流行的仿真计算工具.综合两种开发环 境各自的优势,可采用VB与Matlab混

实现VB与EXCEL的无缝连接

excel 如何实现VB与EXCEL的无缝连接 VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报表功能.但由于VB与EXCEL由于分别属于不同的应用系统,如何把它们有机地结合在一起,是一个值得我们研究的课题. 一. VB读写EXCEL表: VB本身提自动化功能可以读写EXCEL表,其方法如下: 1.在工程中引用Microsoft Excel类型库

关于vb.net读取excel的问题

问题描述 关于vb.net读取excel的问题 vs2015 Microsoft Excel 16.0 Object Library MyExcel = New Microsoft.Office.Interop.Excel.Application MyExcel.Visible = False ExcWorksbook = MyExcel.Workbooks.Open("D:Info.xlsx") ExcSheet = ExcWorksbook.Sheets(1) ExcWorksbo

vb.net-在VB.NET中怎样调用第三方的 .DLL

问题描述 在VB.NET中怎样调用第三方的 .DLL 小弟初学VB.NET,现在遇到一个问题: VB2010怎样调用一个第三方的DLL? 例如:Prodave6.DLL (西门子开发的一个库,里面有和PLC通讯的函数...), 我尝试在项目中添加引用,但是提示 "未能添加对.........Prodave6.dll 的引用.请确保此文件可访问并且是一个有效的程序集或COM组件." 请问这是什么原因? 解决方案 vb.net调用外部DLLVB.net中调用CC++ 的DLLvb.net

VB.NET 重绘技巧

问题描述 外行~~基本的控件使用,数据库之类已经比较熟了,现在想学习一下重绘,看了一些例子,都是c#,很多方法比较晦涩.因此希望哪位热心的朋友给个简单的vb.net的重绘例子,让我学习一下,关键位置注释一下.例一.TabControl的标题四方形右上角重绘成斜的.(就是剪刀把右上角减掉一小三角,变成直角梯形的样子)例二.Button右上角直角重绘成斜的.(就是剪刀把右上角减掉一小三角,变成直角梯形的样子)例三.DataGridView列头重绘成平面的例四.DataGridView某个列头加个co

vb.net中关于水晶报表的操作(初学者求指教)

问题描述 现在有个项目要求用水晶报表控件制作报表,数据库的数据是根据硬件信息变化的.现在做好样式如图,我也是拖的数据库中的对应字段但是显示的是随机的数据.希望大神给点指点(给了思路也行,刚接触vb.net没头绪) 解决方案 解决方案二:绑定了字段,后台刷新下数据不就完事了么...解决方案三:1.先建一个DataSet,再在里边建一个DataTable,设置相应的字段名称(类型我一般都用字符串).2.建立一个存储过程,将数据写入DataTable.如果用一个简单Query就可实现,则此存储过程可以