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);