我爱Aspx >> VB.Net >> VB.net是怎样做到的(一、二)VB.net是怎样做到的(一、二)
et是怎样做到的(一)
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是怎样做到的(四、五)[05-20]
VB.NET是怎样做到的(五、六)[05-20]
VB.NET实现PhotoShop的流动选取框[05-20]
VB.NET是怎样做到的(七)——可..[05-20]
VB.NET是怎样做到的(八)——On..[05-20]
使用VB.NET加密文件[05-20]
如何在asp.net页面上放置的控件上..[05-20]
如何在VS.NET/C# Builder开发的网..[05-20]
VB.Net学习笔记(前言)[05-20]
VB.Net学习笔记(基础概念和语法..[05-20]
VB.net是怎样做到的(四、五)[05-20]
VB.NET是怎样做到的(五、六)[05-20]
VB.NET实现PhotoShop的流动选取框[05-20]
VB制作的可以限制输入的文本框[05-20]
可以限制中文输入的文本框[05-20]
VB.NET是怎样做到的(七)——可..[05-20]
VB.NET是怎样做到的(八)——On..[05-20]
使用VB.NET加密文件[05-20]
DataGrid常见解决方案(三)--在Da..[05-20]
引言:Kent Beck 曾经说过“我只..[05-20]