VB考试教程:过程的使用之过程参数传递
2.过程参数转移
一个进程通常需要一些程序当前状态的信息来完成它的工作。程序的当前状态信息还包含调用过程时传递给过程的变量。当一个变量传递给一个过程时(完成了形参和实参的组合),这个变量就叫做参数。
(1)参数的数据类型
过程的参数类型默认为变量数据类型。但是,您也可以将参数声明为其他数据类型。例如:函数接受一个字符串变量和一个整数变量:
函数WhatForLunch(工作日为字符串,小时为整数)为字符串
如果WeekDay="Saturday "那么
WhatForLunch= " Fish "
ELse
WhatForLunch = " Chicken "
End If
如果Hour>2那么WhatForLunch = "对不起,太晚了!"
结束功能
(2)按地址传递参数。
按地址传递参数的过程(也称为“引用”)使进程通过变量的内存地址访问实际变量的内容。当变量被传递给过程时,变量的值可以在过程中被改变。通过地址传递参数是VB的默认设置。
如果为通过地址传递的参数指定数据类型,则必须将此类型的值传递给该参数。也可以将一个表达式传递给参数,VB根据所需类型计算表达式并将值传递给参数。
当通过地址传递变量时,对变量的任何修改都会传递给调用进程。地址参数调用在调用过程中修改变量有明显的优势,只是不要在过程中无意中修改变量。
例如,下面的子流程声明和调用:
子成本加利息(成本,合计)
成本=成本*1.05 '成本加5%
合计=Int(Cost)'然后取整数并返回
末端接头
调用:
……
Price = 100
Total = 0
costplus interest Price,Total
Print Price;“5%的利息是”;总数
在本例中,程序将两个地址变量传递给CostPlusInterest过程:Price和Total。程序员计划在后续的Print方法中使用更新后的Total变量,但是不小心忘记了在过程的中间步骤更新了Price变量,所以当程序运行时,结果如下:
5%的利息是105
没有达到预期的效果。
(3)按值传递参数。
避免上述问题的一个好方法是按值传递参数。通过值传递参数只会传递变量的副本。如果在流程执行过程中更改了该值,所有更改将只影响副本,而不会影响变量本身。使用ByVal关键字指示参数通过值传递。
例如,如果修改上面的示例,就不会出现上面的错误。修改如下:
子成本加利息(按价值计算的成本,合计)
当用ByVal声明成本参数时,将产生正确的结果:
利率为5%的100英镑等于105英镑
如果不想依赖ByVal关键字,还可以使用另一种方法来防止传递的变量被修改:将变量放在括号中,并将其转换为文字值。在上面的示例中,调用costplusinterest过程的语句是:
costplusinterest(价格),总计,
也可以得到正确的结果。
再举一个例子,有下面的代码:
选项显式
函数multiply(byval n as integer)as integer
multiply = 1
do while n > 0
multiply = multiply * n ' Find n!
n = n - 1
循环
结束函数
private Sub Form _ Click()
Dim sum As Integer,i As Integer
For i = 5比1 Step-1
sum = sum+Multiply(I)
Next
Print " sum = ";sum
End Sub
运行结果是153(5!+4!+3!+2!+1!)。
如果去掉函数的参数n前的“ByVal”,结果是120(5!),这显然不是编辑的本意,是错误的。
对于什么时候使用值传递方法,什么时候使用地址传递方法,没有硬性规定。以下规则可供参考:
1)对于整形、长整形或单精度参数,如果不希望进程修改自变量的值,就要加上关键字ByVal(按值传递)。为了提高效率,字符串和数组要通过地址来传递。此外,用户定义的类型(记录类型)和控件只能通过地址传输。
2)其他数据类型,包括双精度、货币和变量数据类型,可以通过两种方式传输。但经验证明,这样的参数是通过值来传递的,可以避免参数的误用。
3)如果不确定,通过值传递的方式传递所有变量(字符串、数组、记录类型变量除外)。程序写好能正确运行后,改变一些参数进行地址转移,加快运行速度。这样,即使删除了某个ByVal后程序无法正确运行,也很容易找到错误在哪里。
(4)使用可选参数。
VB提供了非常灵活和安全的参数传递方式,允许使用可选参数和可变参数。调用过程时,可以向过程传递可选参数或任意数量的参数。
在前面的例子中,一个过程的形参(形参)是固定的,调用时提供的实参(实参)也是固定的。也就是说,如果一个过程有三个形参,那么它必须用三个相同顺序和类型的实参来调用。
在VB中,可以指定一个或多个参数作为可选参数。比如我们设置了一个计算两个数乘积的过程,可以有选择地乘以第三个数。调用时,可以给它传递两个参数或三个参数。
位律师回复
0条评论