VB.NET函數(shù)寶典手把手教會你
經(jīng)過長時間學習VB.NET函數(shù),于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
在程序設計過程中,隨著代碼量的不斷增加,會出現(xiàn)很多地方使用同樣代碼的情況。為了能夠減少同樣代碼的編寫,ASP.NET允許使用一些小的程序?qū)⒅貜偷拇a只寫一次,其他需要使用這段代碼的地方調(diào)用這個小程序就可以了。
在ASP.NET中,實現(xiàn)這種小程序的方式有兩種:過程和函數(shù)。
模塊化的優(yōu)點
模塊化是在程序設計發(fā)展到一定程度的時候誕生的程序設計方法。在早期的程序設計過程中,由于機器的硬件配置低,所以程序的運行速度和效率十分重要,因此早期的程序設計人員會大量使用各種技巧保證程序的快速運行,而這些技巧導致的最直接后果就是程序的結構混亂,很難閱讀。
隨著機器硬件的不斷更新,這些編程技巧所提高的程序運行速度已經(jīng)微不足道,這時提高程序的可讀性就變得十分重要,于是就出現(xiàn)了模塊化程序設計方法。
模塊化程序設計方法的特點是:在編寫程序之前,把程序的功能分解成若干個小的任務,并把這些小任務看成是一個一個的模塊。當各個模塊編寫完成之后,就可以把這些模塊編譯成為一個大型的程序。由于每個模塊都有自己獨立的功能,所以可以把這些模塊分配給很多程序員來完成;而每個模塊的功能都是詳細定義的,所以可以建立完善的文檔,使得程序的可讀性大大提高。
VB.NET函數(shù)
VB.NET支持子過程和函數(shù),它們都可以根據(jù)需要設置參數(shù)。它們之間惟一的區(qū)別是函數(shù)可以有返回值而子過程沒有。
子過程的定義方式為:
- Sub subname ([argument1[,…, argumentn]])
- [statements]
- End Sub
對于子過程的調(diào)用方式是直接調(diào)用過程名subname。如果有參數(shù),就在后面按照次序?qū)?shù)在括號中寫好。用一個子過程顯示對一個用戶的問候信息:
- <script language="vb" runat="server">
- Sub SayHello(strUserName as String)
- Response.Write ("Hello!" & strUserName & "<br>")
- End Sub
- </script>
- <%
- SayHello("Cindy")
- %>
在上面的例子中,有下面幾點需要說明:
(1) 在第1行~第5行使用<Script>標記加入程序代碼。
(2) 在第2行~第4行定義了一個SayHello子過程。這個過程帶有一個參數(shù)strUserName,并在第3行輸出。
(3) 在第7行調(diào)用了這個子過程。在調(diào)用的時候,傳入?yún)?shù)的值是“Cindy”。
VB.NET函數(shù)的定義方式為:
- Function functionname ([argument1[,…, argumentn]])
- [statements]
- [Return value]
- [statements]
- End Function
對于函數(shù)的調(diào)用方式是調(diào)用函數(shù)名functionname()。如果有參數(shù),就按照次序?qū)懺诶ㄌ栔小S靡粋€函數(shù)計算兩個整數(shù)的和。
- <script language="vb" runat="server">
- Function Add(intData1 as Integer,intData2 as Integer) as Integer
- intData1intData1=intData1+intData2
- Return intData1
- End Function
- </script>
- <%
- Dim intTemp1,intTemp2 as Integer
- intTemp1=2
- intTemp2=3
- Response.Write(Add(intTemp1,intTemp2))
- Response.Write("<br>")
- Response.Write(intTemp1)
- %>
在上面的程序中,有下面幾點需要說明:
(1) 在第2行~第5行定義了一個函數(shù)Add。這個函數(shù)帶有兩個參數(shù):intData1和intData2,并把一個整數(shù)作為返回值。
(2) 在第3行把參數(shù)intData1與intData2的和放到intData1中,并在第4行把intData1作為結果返回。
(3) 在第11行調(diào)用了這個函數(shù),并把結果顯示出來。
在上面的子過程和函數(shù)的講解過程中,可以看出都可以采用帶參數(shù)的方式來增加子過程和函數(shù)的靈活性。需要說明的是,參數(shù)的傳遞有兩種方式:通過值傳遞參數(shù)和通過引用傳遞參數(shù)。
在調(diào)用子過程和函數(shù)的時候,如果沒有明確地指出,所有的參數(shù)都是通過值進行傳遞的。所謂通過值進行傳遞,就是把參數(shù)的值復制到參數(shù)中。例如例2.12中第11行的Add(intTemp1,intTemp2),就是通過值進行傳遞的好例子。在真正執(zhí)行第2行~第5行定義的Add函數(shù)時,是把intTemp1的值2復制給了intData1,把intTemp2的值3復制給了intData2。在第3行把intData1和intData2的和賦值給intData1的時候,intData1的值變成了5,但是這個時候,intTemp1的值仍然是2,不是5(通過第13行的執(zhí)行可以看出來),這就是通過值傳遞參數(shù)。這時,intData1和intTemp1是兩個不同的變量,在內(nèi)存中占用不同的存儲空間。
在函數(shù)和子過程中,使用關鍵字ByVal來顯式表示通過值傳遞參數(shù)。也就是說,如果要用顯式的方式進行定義,第2行的函數(shù)定義可以寫成:
- Function Add(ByVal intData1 as Integer, ByVal intData2 as Integer) as Integer
默認的情況是采用通過值傳遞參數(shù)。那么什么是通過引用傳遞參數(shù)呢?請先看下面的例子。用一個函數(shù)計算兩個整數(shù)的和。
- <script language="vb" runat="server">
- Function Add(ByRef intData1 as Integer,ByRef intData2 as Integer) as Integer
- intData1intData1=intData1+intData2
- Return intData1
- End Function
- </script>
- <%
- Dim intTemp1,intTemp2 as Integer
- intTemp1=2
- intTemp2=3
- Response.Write(Add(intTemp1,intTemp2))
- Response.Write("<br>")
- Response.Write(intTemp1)
- %>
在這里使用了ByRef關鍵字表示這時的參數(shù)是通過引用進行傳遞的。執(zhí)行這個程序就會發(fā)現(xiàn),在程序執(zhí)行完之后,不但intData1的值變成了5,同時intTemp1的值也變成了5。
通過引用傳遞參數(shù)的方法是把參數(shù)的地址傳遞進去。在第11行進行傳遞的時候,不是把intTemp1的值復制給intData1,把intTemp2的值復制給intData2,而是把intTemp1的地址給了intData1的地址,把intTemp2的地址給了intData2的地址。在傳遞成功之后,intData1就是intTemp1,intData2就是intTemp2。所以在第3行intData1的值發(fā)生變化時,intTemp1的值也同時發(fā)生了變化。
變量的作用域
在進行變量聲明時,變量聲明的位置決定了這個變量的作用范圍。在一個過程或VB.NET函數(shù)外聲明的變量是全局變量,對本程序內(nèi)部所有的過程和函數(shù)都起作用;而在一個過程或函數(shù)內(nèi)部聲明的變量是局部變量,只對本過程或函數(shù)起作用。
下面通過一個例子說明全局變量和局部變量的區(qū)別。全局變量和局部變量的使用。
- <script language="vb" runat="server">
- Dim strGlobal as String="global"
- Sub SayHello
- Dim strTemp as String="hello!"
- Response.Write (strTemp & "<br>")
- Response.Write (strGlobal & "<br>")
- if strGlobal<>"" then
- Dim strTemp1 as String="hello cindy!"
- Response.Write (strTemp1 & "<br>")
- end if
- 'Response.Write (strTemp1 & "<br>")
- End Sub
- </script>
- <%
- SayHello
- %>
上面的例子中,有下面幾點需要說明:
(1) 第2行聲明的變量strGlobal定義在所有的VB.NET函數(shù)或者過程之外,所以是一個全局變量。由于在定義這個變量的時候就為這個變量賦值為“global”,所以,在后面的程序中,第一次使用這個變量時這個變量的值就是“global”。
(2) 第3行~第12行定義了一個子過程SayHello。在這個過程中,首先在第4行定義了一個變量strTemp,由于這個變量是定義在子過程中的,所以這個變量是一個局部變量。在第5行顯示這個變量的值的時候,會顯示一個“hello!”字符串。
(3) 第6行要顯示strGlobal的值,由于這是一個全局變量,所以會顯示第1行賦值的“global”。
(4) 第7行~第10行定義了一個If/Endif代碼塊,在這個代碼塊中,定義了一個塊級局部變量strTemp1(第8行)。由于這個變量是定義在代碼塊中的,所以只在這個代碼塊中起作用。所以在第9行要顯示它的值的時候,會顯示“hello cindy!”。而如果取消第11行的注釋,系統(tǒng)將會通告strTemp1變量沒有定義。
通過上面的例子可以看出,在編寫程序的時候,要時刻注意變量的作用域的問題。因為在不同模塊中修改全局變量會導致模塊之間相互影響,違反了進行模塊化程序設計的初衷。所以要設計好的程序,就應該盡量減少全局變量的使用。
【編輯推薦】