经过长时间学习VBNET局部静态变量于是和大家分享一下看完本文你肯定有不少收获希望本文能教会你更多东西VBNET能够实现很多C#不能做到的功能如When语句Optional参数局部Static变量对象实例访问静态方法Handles绑定事件On Error处理异常Object直接后期绑定等等VB和C#同属NET的语言编译出来的是同样的CIL但为什么VB支持很多有趣的特性呢我们一起来探究一下VBNET局部静态变量
VBNET局部静态变量
VB支持用Static关键字声明局部变量这样在过程结束的时候可以保持变量的数值
PublicSubTest()StaticiAsIntegeri+=实现一个过程调用计数器EndSub
我们实现了一个简单的过程计数器每调用一次Test计数器的数值就增加其实还有很多情况我们希望保持变量的数值而C#的static是不能用在过程内部的因此要实现过程计数器我们必须声明一个类级别的变量这样做明显不如VB好因为无法防止其他过程修改计数器变量这就和对象封装一个道理本来应该是一个方法的局部变量现在我要被迫把它独立出来显然是不好的设计那么VB是怎么生成局部静态变量的呢?将上述代码返汇编我们可以清楚地看到在VB生成的CIL中i不是作为局部变量而是作为类的Field出现的
fieldprivatespecialnameint$STATIC$Test$$i
也就是说i被改名作为一个类的字段但被冠以specialname在代码中试图访问$STATIC$Test$$i是不可能的因为它不是一个有效的标识符但是在IL中将这个变量加一的代码却与一般的类字段完全一样是通过ldfld加载的我觉得这个方法十分聪明把静态变量变成生命周期一样的类字段但是又由编译器来控制访问的权限让它成为一个局部变量同时也解释了VB为什么要用两个不同的关键字来声明静态变量—— Static和Shared
由于VBNET局部静态变量的实质是类的字段所以它和真正的局部变量还是有所不同的比如在多线程条件下对VBNET局部静态变量的访问就和访问字段相同