Delphi中TProc<Integer>的传入参数值是否可以被修改?
Delphi TProc匿名过程参数修改问题解答
直接结论
你给出的示例代码可以正常通过编译,但对aValue的赋值操作仅作用于匿名过程内部,不会影响外部传入的原始变量。
原因说明
- Delphi 中默认的
TProc<T>泛型匿名过程的参数是按值传递的,匿名过程接收到的aValue是外部传入值的副本,对副本的修改不会同步到原始变量。 - 若你需要实现修改外部原始变量的需求,原生
TProc<T>不满足要求,需要自行声明带var修饰的引用传递参数的泛型匿名过程类型,实现示例如下:
// 自定义支持引用传参的泛型匿名过程类型 type TProcWithRef<T> = reference to procedure(var aValue: T); // 调用示例 procedure Test; var ModifyProc: TProcWithRef<Integer>; OriginValue: Integer; begin OriginValue := 10; ModifyProc := procedure(var aValue: Integer) begin aValue := 5; end; ModifyProc(OriginValue); // 执行完成后 OriginValue 的值将变为 5 end;
额外说明
如果你的参数是引用类型(比如类、接口实例),那么即使是按值传递参数,修改参数指向的实例的成员属性是可以同步到外部的,因为按值传递的只是实例的指针副本,指向的还是同一个实例对象,只有修改指针本身才不会生效。
内容的提问来源于stack exchange,提问作者Peter Jones
相关产品推荐
相关产品推荐

