3.6.2 参数传递


  本文标签:参数 VB ASP .NET ASP .NET程序设计教程

  参数是在本过程中有效的局部变量  。在调用一个带有参数的过程时,首先进行的是形参和实参的结合,即实现调用过程的实参与被调过程的形参之间的数据传递  。VB .NET参数传递有两种方式:按值传递和按地址传递  。
每个参数的格式说明为:
[{ByVal|ByRef}] [ParamArray] 参数名 [()] As 参数类型 [=默认值]
参数表中可有多个参数,以逗号隔开  。

  1. 按值传递参数
按值传递参数方式在VB .NET中是默认的,用“ByVal”关键字指出参数是按值来传递的  。按值传递时,首先为形参变量分配一个临时的内存单元,然后将实参的值传递到这个临时单元中  。按值传递是单向的,如果过程改变了形参值,则只是影响临时单元的值,而不会影响实参变量的值  。例如:
Sub Inc(ByVal i As Integer)
i = i+1
End Sub
Sub CallInc()
Dim X As Integer = 10
Response.Write("X=" & X)
Inc(X)
Response.Write("X=" & X)
End Sub
CallInc过程中调用Inc函数,将实参X的值(10)传递给形参变量i,函数Inc()将i增1,但这个改变并不影响实参变量X的值,因此CallInc两次输出的X均为10  。

  2. 按地址传递参数
按地址传递参数是将调用过程的实参变量地址传递给相应的形参,这样实参和形参具有相同的地址,即形参与实参共享存储单元,因此,在被调用过程中若改变形参的值,则相应的实参值也被改变  。用“ByRef”关键字指出参数是按地址来传递的  。按地址传递的效率比较高,因为,无论变量是什么类型,传进的都只是4个字节  。
【例3.8】将两个变量的值进行交换  。程序执行时显示图3-15所示的界面,在上面的两个文本框中输入两个整数,点击“提交”按钮,将在下面的两个文本框中显示交换以后的值,如图3-16所示  。
图3-15   运行界面
本例设计一个Swap(ByRef X, ByRef Y)子程序,使用传地址参数“ByRef”将X和Y对应的实参值交换  。
源代码如下(Ex3-8.aspx):

  




交换变量值



请输入两个整数:A=  

    A=  


执行交换操作后:A=  

    A=  


图3-16   运行结果 

图3-16   运行结果

  3. 可选参数
参数表中含有“Optional”关键字的参数为可选的  。若某参数是可选的,则参数表中该参数之后的所有参数也必须是可选的  。每个可选的参数一定要有一个默认值,并且可选参数的默认值必须是常数  。下面的例子给出了带有可选参数的过程的定义:
Sub ABC(Optional ByVal MyCountry As String="China")
……  子程序体语句
End Sub
当调用这个过程的时候,可以选择是否给过程传递参数,如果不传递参数,则过程使用默认的参数  。例如过程调用ABC() 未给出实参值,因此将使用参数的默认值”China”  。

  4. 数组参数
在定义过程时,可用数组作为参数  。声明数组参数的语法格式与一般参数有区别  。
语法:
[ByVal|ByRef] 形参数组名() [As 数据类型]
其中,数据类型为形参数组的元素类型  。形参数组对应的实参数组必须也是数组,并且数据类型与形参数组元素类型一致  。实参表中的数组不需要使用“()”  。数组参数传递的特点是形参数组与实参数组共用存储空间  。传递数组的方式可以是ByVal(默认方式) 或ByRef;当以ByVal方式传递时,过程中的语句可以改变数组的元素值,但不能改变参数数组  。ByRef方式可以改变参数数组  。
例如,以下子程序求数组A各元素之和,n为数组的最大下标值:
Sub SumArray(A() As Integer,n As Integer)
Dim i As Integer, S As Integer =0
For i = 0 To n
S += A(i)
Next
End Sub
【例3.9】显示如图3-17所示的货品表  。设计一个子程序DisplayGoods,以二维数组作为输入参数,显示二维数组各元素的值;在Page_Load事件处理过程中,将货品的品名、数量和单价数据存储于一个二维数组中,将该数组作为实参传递给DisplayGoods  。
图3-17   利用数组参数传递表格数据并显示之
源代码如下(Ex3-9.aspx):

  说明:
1) Sub DisplayGoods(A(,) As Object),其中A(,)表示参数是二维数组  。
2) 程序中使用了LBound(A, 1)、UBound(A,1)、LBound(A,2)、UBound(A, 2) 分别取数组第一维和第二维的最小和最大下标值  。
3) 使用了Object类型的数组,Object类型可以是任何一种数据类型,包括字符串和数字
类型  。

【责任编辑:老杨 Tel:(010)68576606-8005】


回书目   上一节   下一节