VB.NET局部静态变量介绍

  经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。VB.NET能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#同属.NET的语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下VB.NET局部静态变量。

  VB.NET局部静态变量

  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局部静态变量的访问就和访问字段相同。

时间: 2024-09-10 16:13:06

VB.NET局部静态变量介绍的相关文章

了解PHP的返回引用和局部静态变量

  这篇文章主要介绍了了解PHP的返回引用和局部静态变量,返回引用一般的写法是方法名前加&,局部静态变量也有很妙用,需要的朋友可以参考下 先阅读手册 ========== 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & : 代码如下: function &returns_reference() { $someref = 0; return $someref; } $newref = &returns_reference();//相当于 $ne

PHP引用操作以及外部操作函数的局部静态变量的方法

通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引用符才能保持地址操作 3. 函数返回值引用必须在函数申明时以及调用时都添加引用操作符 该例子使用的是对象方法的操作,同样适用于函数 <?php class A { public function & test1(& $a) { static $i = 0; var_dump($i); $

PHP static局部静态变量和全局静态变量总结

 使用静态局部变量的原因是它不能被外部使用,但是它的值依然在没此使用后保留.虽然使用全局变量可以实现相同的功能,但是它经常会造成意外 静态局部变量的特点:   1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它.倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值 2.静态局部变量只会初始化一次 3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式.即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变

c语言-C中什么情况下把局部变量定义为局部静态变量

问题描述 C中什么情况下把局部变量定义为局部静态变量 之前都是定义的要么是全局变量要么就局部变量,从来没加过static,现在看到有的变量前面加了static,不知道什么类型的变量要这样定义 解决方案 如果你希望在一个函数中对一个变量只执行一次初始化,以后不再初始化,使用上一次结果,就应该使用静态局部变量. 例如: static int n; 其他类型都可以. 解决方案二: 比如说你要在局部计算一个圆的半径,那么你可以将PI的值申请为static,因为PI以后再也不会变更了!希望能够帮到你! 解

PHP static局部静态变量和全局静态变量总结_php技巧

静态局部变量的特点: 1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它.倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值2.静态局部变量只会初始化一次3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式.即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量):静态变量的初始值为0.4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量.虽然用全局变量也可以达到上述目的

了解PHP的返回引用和局部静态变量_php技巧

先阅读手册 ========== 从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :  复制代码 代码如下: <?php  function &returns_reference()  {      $someref = 0;      return $someref;  }     $newref = &returns_reference();//相当于 $newref = &$someref;  ?> 有关引用的更多信息, 请

c++-C++的简单静态变量问题

问题描述 C++的简单静态变量问题 这道题是有关局部静态变量的使用,第一次调用函数返回0,以后每次被调用返回值增加1, 但是运行结果不合乎预期,请指教! 代码如下: #include using namespace std; unsigned myCnt() { static unsigned iCnt = -1; ++iCnt; return iCnt; } int main() { cout << "请输入任意字符后按回车键继续" << endl; char

php中static 静态变量和普通变量的区别

在变量的前面加上static 就构成了静态变量(static 变量). static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误. static变量和普通变量的区别: static全局变量与普通

C/C++ 静态变量解析

静态变量:这种变量的内存将保存到整个程序的结束,他的内存是独立存放到一个叫做静态内存区的.           所有的静态的变量如果不赋值,会默认赋值为0,不管是结构体还是其他类型的变量,           当然静态变量的初始化也分为静态初始化和动态初始化,如果有一些不可确定的因素会使用           动态初始化           比如:           int a = 1;静态初始化.           double a = sqrt(2);动态初始化因为sqrt是一个不确定的