初始化字符串函数结果? [英] Initialise string function result?

查看:57
本文介绍了初始化字符串函数结果?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚调试了一个函数,该函数返回的字符串让我很担心。我一直认为返回字符串的函数的隐式Result变量在函数调用开始时为空,但是以下(简化的)代码产生了意外的结果:

 函数TMyObject.GenerateInfo:字符串; 

过程AppendInfo(const AppendStr:string);
if(Result>’’)开始
然后
Result:= Result +#13;
结果:=结果+ AppendStr;
结尾;

开始
if(ACondition)然后
AppendInfo( Some Text);
结尾;

多次调用此函数会导致:

 某些文本 

第一次,

 某些文本 
某些文本

第二次,

 某些文本 
某些文本
某些文本

第三次,等等。



要修复它,我必须初始化结果:

 开始
结果:='';
if(ACondition)则
AppendInfo( Some Text);
结尾;

是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不针对字符串函数发出警告 W1035函数 xxx的返回值可能未定义?我是否需要遍历所有代码以确保设置了一个值,因为如果未显式设置结果,从函数中期望一个空字符串是不可靠的?



我已经在一个新的测试应用程序中对此进行了测试,结果是相同的。

 过程TForm1.Button1Click(Sender: TObject); 
var
i:整数;
S:字符串;
for i:= 1至5开始

S:= GenerateInfo;
ShowMessage(S); // 5行!
结尾;


解决方案

这不是错误,而是 功能


对于字符串,动态数组,方法
指针或变量结果,如果
函数结果声明为
,则
效果与相同。
声明的参数之后的其他var参数
。换句话说,
调用者传递了一个附加的32位
指针,该指针指向
中的一个变量,该变量返回函数结果。


即您的

 函数TMyObject.GenerateInfo:string; 

这真的是:

 过程TMyObject.GenerateInfo(var结果:字符串); 

请注意前缀 var (而不是 out

这是 SUCH 不直观,因此会导致代码中出现各种问题。有问题的代码-此功能结果的一个示例。



查看并投票给此请求


I've just been debugging a problem with a function that returns a string that has got me worried. I've always assumed that the implicit Result variable for functions that return a string would be empty at the start of the function call, but the following (simplified) code produced an unexpected result:

function TMyObject.GenerateInfo: string;

        procedure AppendInfo(const AppendStr: string);
        begin
          if(Result > '') then
            Result := Result + #13;
          Result := Result + AppendStr;
        end;

begin
  if(ACondition) then
    AppendInfo('Some Text');
end;

Calling this function multiple times resulted in:

"Some Text"

the first time,

"Some Text"
"Some Text"

the second time,

"Some Text"
"Some Text"
"Some Text"

the third time, etc.

To fix it I had to initialise the Result:

begin
  Result := '';
  if(ACondition) then
    AppendInfo('Some Text');
end;

Is it necessary to initialise a string function result? Why (technically)? Why does the compiler not emit a warning "W1035 Return value of function 'xxx' might be undefined" for string functions? Do I need to go through all my code to make sure a value is set as it is not reliable to expect an empty string from a function if the result is not explicitly set?

I've tested this in a new test application and the result is the same.

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  S: string;
begin
  for i := 1 to 5 do
    S := GenerateInfo;
  ShowMessage(S); // 5 lines!
end;

解决方案

This is not a bug, but "feature":

For a string, dynamic array, method pointer, or variant result, the effects are the same as if the function result were declared as an additional var parameter following the declared parameters. In other words, the caller passes an additional 32-bit pointer that points to a variable in which to return the function result.

I.e. your

function TMyObject.GenerateInfo: string;

Is really this:

procedure TMyObject.GenerateInfo(var Result: string);

Note "var" prefix (not "out" as you may expect!).

This is SUCH un-intuitive, so it leads to all kind of problems in the code. Code in question - just one example of results of this feature.

See and vote for this request.

这篇关于初始化字符串函数结果?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆