易语言中函数参数“参考”的基本概念
易语言中函数参数“参考”的基本概念是一个非常核心且重要的特性,理解了它就能更好地控制程序中的数据流。
■ 一、基本定义
参考,在易语言中,相当于其他编程语言(如C++、C#)中的 “引用传递”。
它的核心作用是:允许被调用的子程序(函数)修改调用者(父程序)中传递进来的原始变量。
换句话说,当你在参数前勾选了“参考”,你传递给这个参数的就不是变量的“值”,而是变量本身的“地址”或“引用”。子程序内部对这个参数的任何修改,都会直接反映到外部的原始变量上。
■ 二、通过实例理解:有“参考” vs 无“参考”
通过一个最简单的交换数值的例子来对比。
▲ 场景1:不使用“参考”(值传递)
先定义一个子程序 `交换数值_不参考`,它的两个参数 `数值1` 和 `数值2` 都不勾选“参考”。
.子程序 交换数值_不参考
.参数 数值1, 整数型
.参数 数值2, 整数型
.局部变量 临时变量, 整数型
临时变量 = 数值1
数值1 = 数值2
数值2 = 临时变量
然后我们在主程序中调用它:
.子程序 _启动窗口_创建完毕
.局部变量 变量A, 整数型
.局部变量 变量B, 整数型
变量A = 10
变量B = 20
信息框 (“交换前:变量A=” + 到文本(变量A) + “, 变量B=” + 到文本(变量B), 0, , )
交换数值_不参考 (变量A, 变量B)
信息框 (“交换后:变量A=” + 到文本(变量A) + “, 变量B=” + 到文本(变量B), 0, , )
运行结果:
* 第一个信息框显示:`交换前:变量A=10, 变量B=20`
* 第二个信息框显示:`交换后:变量A=10, 变量B=20`
结果分析:
变量A和变量B的值并没有被交换。这是因为在“值传递”方式下,子程序 `交换数值_不参考` 收到的只是 10 和 20 这两个数值的副本。它在内部交换的只是这两个副本,当子程序运行结束,这些副本就被销毁了,外面的原始变量 `变量A` 和 `变量B` 完全没有受到影响。
▲ 场景2:使用“参考”(引用传递)
现在修改子程序,将两个参数都勾选上“参考”。
.子程序 交换数值_参考
.参数 数值1, 整数型, 参考 ; <- 注意这里勾选了“参考”
.参数 数值2, 整数型, 参考 ; <- 注意这里勾选了“参考”
.局部变量 临时变量, 整数型
临时变量 = 数值1
数值1 = 数值2
数值2 = 临时变量
主程序调用方式不变:
.子程序 _启动窗口_创建完毕
.局部变量 变量A, 整数型
.局部变量 变量B, 整数型
变量A = 10
变量B = 20
信息框 (“交换前:变量A=” + 到文本(变量A) + “, 变量B=” + 到文本(变量B), 0, , )
交换数值_参考 (变量A, 变量B) ; 调用带“参考”的子程序
信息框 (“交换后:变量A=” + 到文本(变量A) + “, 变量B=” + 到文本(变量B), 0, , )
运行结果:
* 第一个信息框显示:`交换前:变量A=10, 变量B=20`
* 第二个信息框显示:`交换后:变量A=20, 变量B=10`
结果分析:
交换成功了!因为使用了“参考”,子程序 `交换数值_参考` 收到的是 `变量A` 和 `变量B` 这两个变量在内存中的地址。所以,子程序内部对 `数值1` 和 `数值2` 的操作,实际上就是直接在对 `变量A` 和 `变量B` 本身进行操作。
■ 三、类比理解
* 无“参考”(值传递):就像你把一篇文章电子文档复制了一份给别人。别人可以在复制文件上随意修改、删除,但无论他怎么改,你手里的原件都不会有任何变化。
* 有“参考”(引用传递):就像你直接把这篇电子文档网络分享给了别人。他可以通过这个分享链接直接修改、删除电子文档本身。
■ 四、使用“参考”的注意事项和用途
1. 目的明确:当你希望一个子程序能够“返回”多个结果时,“参考”参数就非常有用。易语言的子程序只能有一个返回值,但通过使用多个“参考”参数,你可以间接地返回多个值。
* 示例:一个子程序 `解析字符串`,可以返回一个是否成功的逻辑值,同时通过两个“参考”参数 `输出字符串1` 和 `输出整数1` 来返回解析出的不同部分。
2. 性能考虑:当传递大型数据结构(如自定义数据类型、数组)时,使用“参考”可以避免复制整个数据所带来的性能开销,因为传递的只是一个地址。
3. 可空属性:当一个参数被勾选“参考”后,它还可以被勾选“可空”。这意味着在调用时,你可以传递一个空值(`空` 类型)给这个参数。因此勾选“可空”时,子程序内部需要判断参数是否为空,以避免程序崩溃。
4. 谨慎使用:因为“参考”参数会修改外部变量,所以使用时要非常小心,确保这是你期望的行为,避免产生难以调试的副作用。
■ 总结
特性 | 无“参考”(值传递) | 有“参考”(引用传递) |
传递内容 | 变量的值(副本) | 变量的地址(引用) |
对原变量影响 | 不会修改原变量 | 会直接修改原变量 |
性能 | 对于大型数据,复制开销大 | 仅传递地址,开销小,效率高 |
风险 | 对数据操作仅局限在函数内部 | 会对外部数据产生直接影响,误操作容易造成损失 |
主要用途 | 保护原数据不被意外修改 | 需要修改原数据或返回多个结果 |
