首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中将UnicodeString附加到WideString中

在Delphi中将UnicodeString附加到WideString中
EN

Stack Overflow用户
提问于 2013-08-15 13:41:38
回答 2查看 1.8K关注 0票数 5

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

代码语言:javascript
复制
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;

涉及多少个字符串转换,在性能上有哪些特别糟糕的?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-15 18:22:57

要回答有关代码实际上正在做什么的问题,请使用以下语句:

代码语言:javascript
复制
result := result + myUnicodeString;

是否有下列情况:

  1. 调用System._UStrFromWStr()Result转换为临时UnicodeString
  2. 调用System._UStrCat()myUnicodeString连接到临时
  3. 调用System._WStrFromUStr()将临时时间转换为WideString并将其分配给Result

有一个System._WStrCat()函数,用于将WideString连接到WideString上(而System._UStrCat()用于UnicodeString)。如果CodeGear/Embarcadero在这方面更聪明,他们可以实现一个System._WStrCat()重载,它以UnicodeString作为输入,WideString作为输出(反之亦然),将WideString连接到UnicodeString上。这样,就不再需要临时UnicodeString转换了。WideStringUnicodeString都被编码为UTF-16 (好吧,但我不会在这里讨论),所以将它们连接在一起只是一个分配和移动的问题,就像将两个UnicodeStrings或两个WideStrings连接在一起时一样。

票数 10
EN

Stack Overflow用户

发布于 2013-08-15 15:40:19

表演很差。没有任何编码转换的必要,因为一切都是UTF-16编码。但是,WideString是COM类型的包装器,其性能比本机UnicodeString差。

当然,您应该更喜欢使用本机类型( UnicodeString或TStringBuilder )完成所有工作,并在最后可能的时刻转换为WideString。

这通常是一项好政策。您不想在内部使用WideString,因为它纯粹是一种互操作类型。因此,仅在互操作边界上转换为(和从) WideString。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18253978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档