ByRef和ByVal
因为每个要传递给函数过程(或子程序)的变量,都可能在接收时改变数值,所以知道如何来保护变量的原始数值是非常重要的。VB有两个关键字,提供或者否认改变变量内容的允许——ByRef和ByVal。VB默认地按地址(关键字ByRef)给函数过程(或子程序)传递信息,引用函数被调用时,函数参数明确的数据。因此,如果函数改变了参数值,原始的数值就被改变了。如果你在函数MyAverage声明参数num1的前面忽略了关键字ByVal时,你就会得到这种结果。如果你想要函数过程改变原始数值,你不必专门在参数前加关键字ByRef,因为,变量数值的传递默认就是ByRef。当你在参数名称前使用关键字ByVal时,VB按值传递参数,这意味着VB复制一份原始数据,然后将复制值传递给函数,如果函数改变了参数的数值的话,原始数据依然不会变——只有复制值变化。这就是为什么函数MyAverage改变了变量num1的数值,而它的原始值还保持不变。
打个比方:
ByVal 就像是你给别人100块钱,这100块钱给了他之后就基本上跟你没关系了,他怎么使用都不再会影响到你的剩余财产。这就是传值调用,即传递的只是参数的值,函数内部对这个值所进行的任何修改都不会改变该参数调用前的变量值(就好比相同名字的两个人,你打其中一个人的脸,另一个人的脸并不会疼,对吧?)。
而 ByRef 就像是你把自己的银行账号和密码告诉别人,那么别人随时可以从中取钱、存钱、查询余额等,也就是说他的操作可以直接改变你的财产数值。这就是传址调用,即传递的是参数的内存地址,函数内部只要修改了这个地址中的内容,那么参数调用前的变量值也会跟着改变(就好比同一个人有不同的两个名字,那么不管是按哪个名字打脸,疼的都是他对吧?)。