领测软件测试网
:gT!V Z3QI?"kJ1Xx!WP当您升级到 .NET Framework 2.0 时,应该复查您的 C# 类,以确保没有任何实例方法。这些类将成为在类声明上使用 static 关键字的备选。本文前面所概述的附加编译时间检查将使得这种复查值得付出努力。在当前的 beta 版本中,Visual Basic 不支持类声明中的 Shared 关键字。但是 Visual Basic 仍然有一些 C# 不可用的技巧。
ZU|oNL软件测试技术门户4X$Y/o"}f iO/w返回页首
软件测试技术门户IgR/s&v z9T1thd静态局部变量
软件测试技术门户0B6O.K1y| HD
z(_*X-C,whPc i;DZ
D(X.}r^(\ PVisual Basic 中一个鲜为人知的功能是支持 Sub 或 Function 中的静态变量。静态局部变量会在方法调用之间保留它们的值。从这点来看,它们的行为就好像一个类级别变量,但是它们的可见性只限制为单个方法。
软件测试技术门户v8@-}9J0\]9rQNO*C/]4P%R;y"J静态局部变量在 .NET 以前的 Visual Basic 版本中就已经推出,因此存在此功能大概就是为了简化旧式代码的移植。尽管 C 和 C++ 编程人员都非常熟悉静态局部变量,但是 C# 没有向前发展此功能。静态局部变量之所以非常令人感兴趣,是因为公共语言运行库 (CLR) 不支持方法内的静态变量。不管怎样,图 10 中的代码都会编译、执行,并通过输出“Count = 1”到“Count = 10”来产生预期的结果。
软件测试技术门户(_`\BY"hkx,p,QJg"m#]5^因为 CLR 不支持静态局部变量,所以 Visual Basic 编译器必须执行一些额外的工作才能使该程序成功。该编译器会使用两个特殊名称向该类添加两个变量,如图 11 的 ILDASM 中所看到的那样。此示例中的第一个字段是一个整数字段,其名称为 $STATIC$GetMessage$200E$i。此字段将在 GetMessage 中保留静态局部变量 i 的值。第二个字段的类型为 StaticLocalInitFlag,它在针对 Foo 类的每个实例第一次执行方法时协助正确初始化变量 i。要注意的重要一点是,这些字段不是共享字段,并且 Foo 的每个实例都有一个要初始化和使用的新局部变量 i。
软件测试技术门户e}Gk1^9Z*TnJ*Gthx`3R*j"b&yy静态局部变量的初始化需要一些操作。如果您在 MSIL 中查找 GetMessage 方法,就会发现 62 个指令(较之于不只使用类级别字段的类似方法的 13 个指令)。这些指令大多数是为了检查 i 的初始化,以及使用锁执行线程安全的初始化。
m:stwx:EvR+UL