在Delphi中将UnicodeString附加到WideString

Rod*_*ddy 5 delphi unicode-string widestring

我很好奇Delphi 2010中这段代码会发生什么:

function foo: WideString;
var 
   myUnicodeString: UnicodeString; 
begin
  for i:=1 to 1000 do
  begin
    myUnicodeString := ... something ...;

    result := result + myUnicodeString;  // This is where I'm interested
  end;
end;
Run Code Online (Sandbox Code Playgroud)

涉及多少字符串转换,是否有任何特别糟糕的性能?

我知道该函数应该只返回一个UnicodeString,但我在VCL流代码中看到了这种反模式,并希望了解该过程.

Rem*_*eau 9

要回答关于代码实际执行的问题,请使用以下语句:

result := result + myUnicodeString;
Run Code Online (Sandbox Code Playgroud)

以下是:

  1. 调用System._UStrFromWStr()转换Result为临时UnicodeString

  2. 调用System._UStrCat()连接myUnicodeString到temp

  3. 调用System._WStrFromUStr()将temp转换为a WideString并将其分配回来Result.

有一个System._WStrCat()连接WideStringa WideString(和System._UStrCat()for UnicodeString)的函数.如果CodeGear/Embarcadero更聪明,它们可能实现了System._WStrCat()一个带有UnicodeString输入和WideString输出的重载(反之亦然,WideString将a 连接到a UnicodeString).这样,UnicodeString就不再需要临时转换了.这两个WideStringUnicodeString被编码为UTF-16(以及大部分,但我不会进入,在这里),所以串联在一起仅仅是一个单一的分配和移动的事情,连接两个时一样UnicodeString秒或2个WideString小号在一起.