Delphi 旁路功能“;“出去”;参数

Delphi 旁路功能“;“出去”;参数,delphi,Delphi,有些函数需要一个变量来发送值。但有时我不需要那个值,也不想定义一个变量来将它用作函数out参数。像这样: procedure test(out SomeVar: string); begin //... end; 我希望安全地执行此操作: test; 您可以创建包装器: procedure test(); overload; var SomeVar : string; begin test(SomeVar); end; 注意:您还必须用重载标记另一个版本,或者您可以

有些函数需要一个变量来发送值。但有时我不需要那个值,也不想定义一个变量来将它用作函数
out
参数。像这样:

procedure test(out SomeVar: string);
begin
   //...
end;
我希望安全地执行此操作:

test; 

您可以创建包装器:

procedure test(); overload;
var
    SomeVar : string;
begin
    test(SomeVar);
end;
注意:您还必须用
重载
标记另一个版本,或者您可以调用包装器而不是
测试
,然后删除
重载

另一个选项:在某处声明一个虚拟变量(可能在单元顶部):

这样,您就不必每次调用函数时都声明一个新变量

test(DummyStr);
使用指针:

procedure test(SomeVar: PString = nil);
begin
  if SomeVal <> nil then SomeVar^ := '';
  //...
  if SomeVal <> nil then SomeVar^ := ...;
end;


您可以重载该过程:

procedure test(out SomeVar: string); overload;
begin
   //...
end;

procedure test; overload; inline;
var dummy: string;
begin
  test(dummy);
end;
注意
inline
关键字,从Delphi 2005 AFAIR开始提供

我通常使用指针而不是
out
参数:

procedure test(SomeVarP: PString=nil); 
begin
   if SomeVarP<>nil then
     SomeVarP^ := ....
end;

这是唯一的办法吗?IDK我可以用
nil
或其他东西代替变量吗?恐怕不行。如果过程指定了out参数,则必须提供该参数。在多线程模式下,所谓的“其他选项”将失败scenarios@DavidHeffernan你是对的。即使在大多数情况下它不应该“失败”,因为
DummyStr
变量内容将被忽略。如果两个线程同时更新它,它将不会中断任何内容,除非设置后在
Test()
过程中使用
out SomeVar
变量。在这种情况下,在运行时跟踪将是一个噩梦般的bug。因此,我不建议使用它,除非您使用
threadvar DummyStr:string
,但我怀疑它速度慢且占用资源(threadvars插槽很少)。@Arnaud TLS插槽很少,但threadvar插槽不多。一个模块中的所有ThreadVar共享同一个TLS插槽。有一些系统函数具有
out
参数,我正在为它们寻找解决方案。我认为包装器(@Blorgbeard)是唯一的解决方案(如果我不想使用全局变量)。谢谢,我想它是在2006年推出的,不是2005年
var
  s: string;

test(@s); 
procedure test(out SomeVar: string); overload;
begin
   //...
end;

procedure test; overload; inline;
var dummy: string;
begin
  test(dummy);
end;
procedure test(SomeVarP: PString=nil); 
begin
   if SomeVarP<>nil then
     SomeVarP^ := ....
end;
var s: string;

test;
test(@s);