浅析VB.NET局部静态变量————————【Badboy】

经过长时间学习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局部静态变量的访问就和访问字段相同。

浅析VB.NET局部静态变量————————【Badboy】

时间: 2024-10-04 21:01:08

浅析VB.NET局部静态变量————————【Badboy】的相关文章

局部静态变量

1 #pragma region 成员函数的局部静态变量应用 2 class CTestA 3 { 4 public: 5 CTestA(); 6 void ReturnCurrentTime(float currentFrame, float nextFrame); 7 }; 8 9 CTestA::CTestA(){} 10 11 void CTestA::ReturnCurrentTime(float currentFrame, float nextFrame) 12 { 13 stati

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

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

一个类成员函数的局部静态变量问题

之前工作中遇到一个问题,就像题目中描述的那样,看起来题目有些拗口复杂,这里解释下,当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的.无意义的.这个需求可以看做是在调用某成员函数时,第一次进行初始化,其他时候不进行操作,即在首次调用时进行初始化,根据这点,很容易想到c/c++里面的static变量,它的作用是保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.根据需求,使用static局部变量,写下

比较全局变量、全局静态变量、局部变量、局部静态变量的区别

比较全局变量.全局静态变量.局部变量.局部静态变量的区别,他们在编译完后存储位置在什么地方.初始化值在什么地方.内存什么时候分配.赋初值对这些变量有哪些影响等.要弄清楚这些问题,首先要弄清楚下面几个知识点. C语言分下面几个存储区: 1.栈区(stack) 由编译器在需要的时候自动分配释放,在不需要的时候就自动清除的变量存储区.通常存放的变量是函数的参数值.局部变量的值等,其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员去分配释放,和编译器完全没有关系,直接由我们的应用程序去

PHP 的 返回引用(方法名前加&) 和 局部静态变量(static)

先阅读手册==========从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & : 例子 17-13. 由函数返回一个引用 <?php   function &returns_reference()   {       $someref = 0;       return $someref;   }      $newref = &returns_reference();//相当于 $newref = &$someref;   ?>

局部静态变量的多线程问题

静态局部变量实在第一次访问的时候进行初始化的,先来看下初始化的过程 class base { public: base(){} }; void fn() { static base t; } 首先定义一个类; 初始化过程的汇编 首先取出一个值和1进行比较 ,如果不等把1 复制给这个地址 然后调用base的构造函数进行初始化 根据上下文 可以理解 其实这个地址就是来标记该静态变量是否进行过初始化,如果没有置为1,然户进行初始化.如果为1,则跳过初始化. 下面考虑多线程的环境当线程1 在赋值标志位之

局部静态变量只能初始化一次是怎么实现?

静态变量可以分为全局静态变量,和局部静态变量,先来说说全局的吧.全局静态变量和全局变量的区别并不大,只是全局静态变量只能在当前文件中使用,而在反汇编中二者并无区别,只可以在当前文件中使用,不过是编译器做出的限制.局部静态变量,会有些特殊,它不会随着作用域结束而消失,在未进入作用于之前就已经存在.局部静态变量和全局变量都保存在二进制文件的数据区,而在代码中的限制,不过是编译器限制而已. 那么当某个函数频繁调用局部静态变量时,C++的语法规定局部静态变量只能初始化一次,那么编译器是怎么做到的呢. 来

【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别

局部变量: 创建在栈区(向下生长),生命周期存在于当前作用域中.     创建时若未初始化,则为随机值. 全局变量: 创建在static区,生命周期一直存在. 创建时若未初始化,则为0. 静态局部变量: 切断了外部链接属性.创建在static区. 创建时若未初始化,则为0. 全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,  未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 全局静态变量: 切断了外部链接属性,创建在static区,生命周期一直存在. 创建

局部静态变量是如何做到只初始化一次的?

关于编译选项 -Wa,-adlhn参考 http://blog.csdn.net/lanxinju/article/details/5900986 以下内容来自于内网别的高人的回复 可以写个程序测试一下: class A { public: A() {} public: int a; }; int static_var_func() { static A a; return a.a++; } int main(int argc, char * argv[]) { static_var_func(