VB.Net中模塊定義的過程的默認(rèn)訪問級(jí)別是Public
堅(jiān)守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都門簾小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站設(shè)計(jì)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
你可以使用ILDasm反匯編一個(gè)VB.Net程序來查看
我進(jìn)行試驗(yàn)的源代碼為(Console Application):
Module Module1
Sub Main()
k()
End Sub
Sub k()
Console.WriteLine("ABC")
Console.ReadLine()
End Sub
End Module
使用ILDasm進(jìn)行反編譯后
k()過程被解釋為:
.method public static void k() cil managed
{
// 代碼大小 20 (0x14)
.maxstack 8
IL_0000: nop
IL_0001: ldstr bytearray (C8 54 C8 54 ) // .T.T
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: call string [mscorlib]System.Console::ReadLine()
IL_0011: pop
IL_0012: nop
IL_0013: ret
} // end of method Module1::k
由此得知,在VB.NET的模塊中定義的過程的默認(rèn)訪問級(jí)別是Public,而不是Friend
isnothing : 檢測(cè)變量值是否為nothing。nothing表示任意數(shù)據(jù)類型的默認(rèn)值,如果變量是引用類型,則值 Nothing 意味著該變量不與任何對(duì)象相關(guān)聯(lián)。
isdbnull:說明對(duì)象的數(shù)據(jù)丟失或不存在,用于指示缺少的值。它不等效于 nullNothing 或empty
null :一般用于數(shù)據(jù)庫中。數(shù)據(jù)庫中的字段可能需要區(qū)分已賦予一個(gè)有意義的值與尚未賦值這兩種情況, 尚未賦值將用 null 值表示。
另外可以為 null 的類型的最重要成員是它有 HasValue 和 Value 屬性。 HasValue 為 FALSE時(shí)
value為 null
empty: 表示尚未實(shí)例化的變量的值,string.empty是空字符串“”,
IsNullOrEmpty:判斷是否為null或者empty.
在VB.NET里,給變量賦值NoThing,其結(jié)果將對(duì)該變量賦予初始值;
而對(duì)于字符串變量初始值就是“”,數(shù)值變量初始值為0,布爾變量初始值為False。
所以對(duì)于字符串變量,賦予NoThing與賦予""是相同的。
1、點(diǎn)擊VS工具。
2、打開后,新建一個(gè)Windows窗體應(yīng)用程序。
3、新建完畢后,如圖所示。
4、拖動(dòng)一個(gè)按鈕。
5、定義數(shù)組最常見的方法,如圖示。
6、運(yùn)行后,點(diǎn)擊按鈕,彈出提示正常。
7、定義數(shù)組第二種方法,屬于動(dòng)態(tài)的方法。
8、運(yùn)行后,點(diǎn)擊按鈕,數(shù)組成功輸出。
如果你在循環(huán)中定義的是值類型變量(如Integer、String等系統(tǒng)預(yù)定義的基本類型,以及用Structure定義的任何類型,如Point),那么是不會(huì)在循環(huán)的過程中不斷地進(jìn)行創(chuàng)建和銷毀,這個(gè)要在ILDASM中看才會(huì)看到。你之所以在VB.NET中看到變量在循環(huán)外面就不見了,那是IDE在作怪,它根據(jù)調(diào)試信息屏蔽掉了。事實(shí)上這個(gè)變量在進(jìn)入函數(shù)的時(shí)候就給你創(chuàng)建好了,并且在推出函數(shù)的時(shí)候才會(huì)被注銷掉。
當(dāng)然,以上的情況不包括用Class定義的所有類。例如Form、Control等。
建立這樣一個(gè)ConsoleApplication,在Sub Main里面添加代碼如下:
Public Sub Main()
Dim i As Integer
For i = 1 To 10
Dim s As String
s = i.ToString()
Next
End Sub
編譯成Exe,然后執(zhí)行VS.NET\Framework SDK\bin\目錄下的ILDASM.EXE,用它打開編譯好的EXE文件,找到Module1,雙擊Main:void(),就可以看到中間代碼了——一種所謂IL的偽匯編。
再來給大家解釋一下吧:
// method表示是“方法”,實(shí)際上就是函數(shù)。
// public和VB中的沒區(qū)別,static表示是Shared的,void表示無返回值,cil表示是符合CIL的,managed 托管的。
method public static void Main() cil managed
{
.entrypoint //表示這里是整個(gè)程序的入口點(diǎn)。
//下面這個(gè)是一個(gè)標(biāo)記,用于表示這個(gè)函數(shù)是單線程的。
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 23 (0x17)
.maxstack 2 //表示本地變量所需要的堆棧大小,2*4Bytes
.locals init ([0] int32 i, // init是初始化的意思,第0號(hào)整型本地變量i
[1] string s) // 第1號(hào)字符串變量s
IL_0000: nop // 空指令
IL_0001: ldc.i4.1 // 將整數(shù)(i4表示整數(shù))1裝入堆棧
IL_0002: stloc.0 // 將頂上的堆棧彈到第0號(hào)本地變量,也就是i中。
// 上面兩句的意思是 (For) i = 1
IL_0003: ldloca.s i // 將本地變量i裝到堆棧頂上。
//調(diào)用實(shí)例化(instance)的Int32.ToString()。(所有的返回值都在堆棧頂端)
IL_0005: call instance string [mscorlib]System.Int32::ToString()
IL_000a: stloc.1 // 將棧頂元素推到第1號(hào)本地變量,也就是s中。
//上面三句的意思是 s = i.ToString()
IL_000b: nop
IL_000c: ldloc.0 // 將i推到棧頂。
IL_000d: ldc.i4.1 // 將整數(shù)1推到棧頂。
IL_000e: add.ovf // 將堆棧最頂上的兩個(gè)元素相加,并進(jìn)行溢出檢查。
IL_000f: stloc.0 // 將相加的結(jié)果(在棧頂)推到i中。
//上面三句的意思是 i = i 1
IL_0010: ldloc.0 // 將i推到棧頂
IL_0011: ldc.i4.s 10 // 將整數(shù)10推到棧頂。
IL_0013: ble.s IL_0003// 如果最頂上的兩個(gè)元素中先入棧的小于等于后入棧的,
// 那就跳轉(zhuǎn)到IL_0003
// 上面三句話的意思是 For (i=1) To 10 ... Next
IL_0015: nop
IL_0016: ret // 返回
} // end of method Module1::Main
于是,在整個(gè)循環(huán)過程中,只有最開始時(shí)有一個(gè)對(duì)s的初始化,其他地方就沒有見到了,甚至沒有看到顯式的“注銷”。這下子不用擔(dān)心寫在里面會(huì)降低效率了。