VB.NET使用局部变量简介

开发 后端
这里介绍VB.NET使用局部变量,在类或者结构初始化的时候,成员变量最好不要显式赋以0、Nothing、False等初值,这样不但没有必要而且会降低性能。

VB.NET有很多值得学习的地方,这里我们主要介绍VB.NET使用局部变量,包括介绍null引用异常等方面。

VB.NET使用局部变量

我们知道,在类或者结构初始化的时候,成员变量***不要显式赋以0、Nothing、False等初值,这样不但没有必要而且会降低性能。因为成员变量首先会被分配内存空间,并且该内存空间自动用“0”进行初始化,因此显式的赋值会增加指令操作而影响性能。

但如果是局部变量呢?

一般情况下,如果不显式初始化局部变量,局部变量会被自动也赋以空值、0、或者false.

'例如以下代码  
Dim b As Boolean  
Console.WriteLine(b)  
Dim rnd1 As Random  
If rnd1 Is Nothing Then  
Console.WriteLine("yes")  
End If  
'最终会输出:"false yes" 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

不过对于引用类型的Random,编译器会给出“ 变量”rnd1“在赋值前被使用。可能会在运行时导致 null 引用异常。” 的警告。值类型则没有任何警告。

ok,再来看下这段代码:

Module Module1Module Module1  
Sub Main()Sub Main()  
Dim rnd As New Random(1000)  
For i As Integer = 0 To 4  
Dim b As Boolean  
Console.WriteLine(b)  
If rnd.NextDouble > 0.5 Then  
b = True 
End If  
Next  
End Sub  
End Module  
 
Module Module1  
 
Sub Main()  
Dim rnd As New Random(1)  
For i As Integer = 0 To 9  
Dim b As Boolean  
Console.WriteLine(b)  
If rnd.NextDouble < 0.5 Then  
b = True 
End If  
Next  
For i As Integer = 0 To 9  
Dim rnd1 As Random  
If rnd1 Is Nothing Then  
Console.WriteLine("yes")  
Else  
Console.WriteLine("no")  
End If  
rnd1 = New Random  
Next  
End Sub  
 
End Module 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

照说每次循环都重新定义并初始化该局部变量,期望的输出值应该一直都是false.但猜猜实际最终输出结果是什么,false,false,false,true,true!!

就是这个怪诞的行为让我困扰了很久。

ok,我们看看对应的il代码:

.method public static void Main() cil managed  
{  
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor()  
.entrypoint  
.maxstack 2  
.locals init (  
[0] class [mscorlib]System.Random rnd,  
[1] bool b,  
[2] int32 i,  
[3] bool VB$CG$t_bool$S0,  
[4] int32 VB$CG$t_i4$S0,  
[5] int32 num)  
L_0000: nop  
L_0001: ldc.i4 0x3e8  
L_0006: newobj instance void [mscorlib]System.Random::.ctor(int32)  
L_000b: stloc.0  
L_000c: ldc.i4.0  
L_000d: stloc.2  
L_000e: ldloc.1  
L_000f: call void [mscorlib]System.Console::WriteLine(bool)  
L_0014: nop  
L_0015: ldc.i4.1  
L_0016: stloc.1  
L_0017: nop  
L_0018: ldloc.2  
L_0019: ldc.i4.1  
L_001a: add.ovf  
L_001b: stloc.2  
L_001c: ldloc.2  
L_001d: ldc.i4.4  
L_001e: stloc.s num  
L_0020: ldloc.s num  
L_0022: ble.s L_000e  
L_0024: ldc.i4.0  
L_0025: stloc.s VB$CG$t_i4$S0  
L_0027: ldloc.3  
L_0028: call void [mscorlib]System.Console::WriteLine(bool)  
L_002d: nop  
L_002e: ldc.i4.1  
L_002f: stloc.3  
L_0030: nop  
L_0031: ldloc.s VB$CG$t_i4$S0  
L_0033: ldc.i4.1  
L_0034: add.ovf  
L_0035: stloc.s VB$CG$t_i4$S0  
L_0037: ldloc.s VB$CG$t_i4$S0  
L_0039: ldc.i4.4  
L_003a: stloc.s num  
L_003c: ldloc.s num  
L_003e: ble.s L_0027  
L_0040: nop  
L_0041: ret  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

晕……编译器居然自动把变量b声明提升到循环体之外……因此就出现了上述的行为。(注:晕啊,以前学c的时候,就学过for(;;){int i=5;}里,i只在***次声明,以前的基础知识全部忘光光。感谢psic的指正。)

我个人猜测,编译器这样做的原因大概是为了性能。可是这样实在是容易造成奇异的行为,最郁闷的是,值类型的变量,编译器根本连警告都没有。

所以,VB.NET使用局部变量,尤其在循环体内使用局部变量,一定要进行初始化。

【编辑推荐】

  1. 浅谈VB.NET线程构造器
  2. 简单分析VB.NET使用线程
  3. VB.NET List(T)编写框架方法
  4. 简单介绍VB.NET线程同步
  5. VB.NET声明API详细描述
责任编辑:佚名 来源: ITPUB
相关推荐

2010-01-20 10:27:07

VB.NET隐式类型局

2010-01-21 10:57:12

VB.NET局部变量类

2010-01-08 15:22:22

VB.NET局部变量

2009-10-28 09:47:01

VB.NET局部静态变

2009-10-16 11:38:47

VB.NET使用Ali

2010-01-13 10:34:23

VB.NET局部静态变

2009-11-02 17:54:44

VB.NET数组

2009-10-14 13:21:46

VB.NET Acco

2009-10-28 17:44:31

VB.NET语言

2009-10-15 09:16:35

VB.NET重新申明数

2009-10-30 15:37:23

VB.NET Sub创

2010-01-08 17:00:22

VB.NET变量和常数

2010-01-14 17:41:57

VB.NET变量范围

2010-01-21 16:37:56

VB.NET变量声明

2009-10-14 17:08:44

VB.NET使用Fil

2010-01-11 16:04:10

VB.NET使用wit

2009-11-03 13:48:02

VB.NET枚举

2009-10-26 15:57:07

VB.NET使用Ora

2010-01-08 18:16:52

VB.NET变量

2011-05-20 16:34:35

VB.NET
点赞
收藏

51CTO技术栈公众号