VB.Net中模块定义的过程的默认访问级别是Public
你可以使用ILDasm反汇编一个VB.Net程序来查看
我进行试验的源代码为(Console Application):
Module Module1
Sub Main()
k()
End Sub
Sub k()
Console.WriteLine("ABC")
Console.ReadLine()
End Module
使用ILDasm进行反编译后
k()过程被解释为:
.method public static void k() cil managed
{
IL_0000: nop
IL_000b: nop
IL_000c: call string [mscorlib]System.Console::ReadLine()
IL_0011: pop
} // end of method Module1::k
由此得知,在VB.NET的模块中定义的过程的默认访问级别是Public,而不是Friend
isnothing : 检测变量值是否为nothing.nothing表示任意数据类型的默认值,如果变量是引用类型,则值 Nothing 意味着该变量不与任何对象相关联.
isdbnull:说明对象的数据丢失或不存在,用于指示缺少的值.它不等效于 nullNothing 或empty
null :一般用于数据库中.数据库中的字段可能需要区分已赋予一个有意义的值与尚未赋值这两种情况, 尚未赋值将用 null 值表示.
另外可以为 null 的类型的最重要成员是它有 HasValue 和 Value 属性. HasValue 为 FALSE时
value为 null
empty: 表示尚未实例化的变量的值,string.empty是空字符串"",
IsNullOrEmpty:判断是否为null或者empty.
在VB.NET里,给变量赋值NoThing,其结果将对该变量赋予初始值;
而对于字符串变量初始值就是"",数值变量初始值为0,布尔变量初始值为False.
所以对于字符串变量,赋予NoThing与赋予""是相同的.
如果你在循环中定义的是值类型变量(如Integer、String等系统预定义的基本类型,以及用Structure定义的任何类型,如Point),那么是不会在循环的过程中不断地进行创建和销毁,这个要在ILDASM中看才会看到.你之所以在VB.NET中看到变量在循环外面就不见了,那是IDE在作怪,它根据调试信息屏蔽掉了.事实上这个变量在进入函数的时候就给你创建好了,并且在推出函数的时候才会被注销掉.
当然,以上的情况不包括用Class定义的所有类.例如Form、Control等.
建立这样一个ConsoleApplication,在Sub Main里面添加代码如下:
Public Sub Main()
Dim i As Integer
For i = 1 To 10
Dim s As String
s = i.ToString()
Next
编译成Exe,然后执行VS.NET\Framework SDK\bin\目录下的ILDASM.EXE,用它打开编译好的EXE文件,找到Module1,双击Main:void(),就可以看到中间代码了——一种所谓IL的伪汇编.
再来给大家解释一下吧:
// method表示是"方法",实际上就是函数.
// public和VB中的没区别,static表示是Shared的,void表示无返回值,cil表示是符合CIL的,managed 托管的.
method public static void Main() cil managed
.entrypoint //表示这里是整个程序的入口点.
//下面这个是一个标记,用于表示这个函数是单线程的.
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
[1] string s) // 第1号字符串变量s
IL_0000: nop // 空指令
// 上面两句的意思是 (For) i = 1
IL_000a: stloc.1 // 将栈顶元素推到第1号本地变量,也就是s中.
//上面三句的意思是 s = i.ToString()
IL_000b: nop
IL_000c: ldloc.0 // 将i推到栈顶.
IL_000e: add.ovf // 将堆栈最顶上的两个元素相加,并进行溢出检查.
IL_000f: stloc.0 // 将相加的结果(在栈顶)推到i中.
//上面三句的意思是 i = i 1
IL_0010: ldloc.0 // 将i推到栈顶
// 上面三句话的意思是 For (i=1) To 10 ... Next
} // end of method Module1::Main
于是,在整个循环过程中,只有最开始时有一个对s的初始化,其他地方就没有见到了,甚至没有看到显式的"注销".这下子不用担心写在里面会降低效率了.