按值和引用区别参数之间的差异

已完成

您可以通过值或引用传递参数。 每种方法都有不同的优点。

通过值传递参数

通过值传递参数时,您将变量的值传递到一个过程。 当使用基础类型时,默认情况下始终采用此方法。

在下一个示例中,函数 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

下面提供了返回复杂类型的更多示例:

返回复杂类型