我在重新编译一些在2009年使用widestring的应用程序时,遇到了一些奇怪的行为。
在Delphi 2009应用程序中,Widestring和String是相同的吗?
我在重新编译一些在2009年使用widestring的应用程序时,遇到了一些奇怪的行为。
在Delphi 2009应用程序中,Widestring和String是相同的吗?
不,它们不相同。
WideString
只是ActiveX/COM的BSTR
类型的包装器。在使用ActiveX/COM中的字符串时需要它。
Delphi 2009
及其后续版本中的String
是UnicodeString
的别名,可以像BSTR
一样保持Unicode字符集,但它与WideString
不同。 WideString
由COM内存管理器分配,而且没有引用计数。 UnicodeString
由RTL内存管理器分配,像AnsiString
一样引用计数。
应尽可能使用(Unicode)String
,仅在进行COM互操作或处理使用WideString
支持Unicode的旧库时才使用WideString
。
还有一件重要的事情需要注意,那就是性能差异。
在Marco Cantu的白皮书中(moodforaday的回答中提到),他说:
"WideString没有引用计数,极其性能和灵活性差(例如,它使用Windows全局内存分配器而不是本地FastMM4)。"
我看到的几乎所有Delphi 2009的升级指南都建议将所有WideStrings转换为Strings。
请查阅Marco Cantu的这篇论文,其中概述了Delphi 2009中字符串(即UnicodeString)的工作原理:
“白皮书:Delphi和Unicode”
http://dn.codegear.com/article/38980
基本上,这就是Roddy所说的,但需要27页来详细说明。