按值和引用区别参数之间的差异
您可以通过值或引用传递参数。 每种方法都有不同的优点。
通过值传递参数
通过值传递参数时,您将变量的值传递到一个过程。 当使用基础类型时,默认情况下始终采用此方法。
在下一个示例中,函数 MyFunction 获取整数类型的参数、更改值并返回 paramA 的值。 Exit 语句返回该值。
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 23
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(paramA : Integer) : Integer
begin
paramA := 17;
Exit(paramA);
end;
即使在运行 MyFunction 过程之后,myInteger 的值仍为 23。
通过引用传递参数
变量始终会分配某部分的计算机内存。 当通过引用传递参数时,不将值传递到过程,而是传递到引用(即值在内存中的位置)。 通过使用此方法,您将直接使用内存进行操作。 因此,更改值也会对您的调用过程产生影响。 要通过引用传递参数,您需要在参数前添加 var 关键字。
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 17
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(var paramA : Integer) : Integer
begin
paramA := 17;
exit(paramA);
end;
返回复杂类型
您现在可以简化 AL 代码并返回复杂类型,而不是在方法参数中传递这些类型。
例如,以下方法会采用名称并返回与名称匹配的第一个客户记录。 请注意签名在过程声明结束时如何指定返回类型,以及如何通过返回所找到的客户记录退出过程。
procedure GetCustomerByName(Name: Text): record Customer;
var
Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
exit(Customer);
end;
您可以使用本新功能直接在返回的变量(例如表达式)中调用成员。
例如,您可以在 IF 语句中使用上述功能,例如
if GetCustomerByName('SomeName')."Balance (LCY)" > 0 then。
下面提供了返回复杂类型的更多示例: