delphi - 哪个受到的打击最大 : AnsiString to String or String to AnsiString?

标签 delphi unicode delphi-2009

就我的目的而言,我实际上真正使用的是 ASCII 字符数据(用于向州提交 ASCII 文本文件),因此仅使用 unicodestring 对最终结果没有帮助(我仍然需要转换一些内容)。

我可以选择在 Delphi 2009 中转换 StrComp 函数,该函数从比较 AnsiString 和 PAnsiChar 到比较 UnicodeString 和 PAnsiChar。

Val : PAnsiChar
Mask : TEditMask;

...

这是我原来的代码,不太好

StrComp(PAnsiChar(Mask.EditText), Val);

...

所以,我可以将其更改为:

StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);

或者,我可以将其更改为这样(“清晰度”的额外转换):

StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));

我记得 Marco Cantu 说过,不要循环执行其中一项,我只是不记得是哪一项或为什么。

最佳答案

如果你编译这个:

StrComp(PAnsiChar(Mask.EditText), Val);

存在从 Mask.EditText 作为 UnicodeString 到临时 AnsiString 的隐式转换,以便允许类型转换为 PAnsiChar。这是你的第二行:

StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);

但是写

StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));

会让PChar(MAskEdit.EditText)返回一个PChar,即一个PWideChar,因此它将使用另一个重载的StrComp 函数。

事实上,自 Delphi 2009 以来,SysUtils.pas 中定义了两个重载函数:

function StrComp(const Str1, Str2: PAnsiChar): Integer; overload;
function StrComp(const Str1, Str2: PWideChar): Integer; overload;

这两个函数都不会调用windows API,而是会一一比较字符,区分大小写。

所以我的建议是,您只需在代码中不要使用任何指针,而在代码中的任何地方都依赖于普通的 string = UnicodeString 变量,并使用此函数相反:

function CompareStr(const S1, S2: string): Integer;

比较将是相同的,并且不会有隐藏转换。与 unicode 和当前 ansi 页面之间的转换(两次 WinAPI 调用)相比,使用 WideChar 而不是 AnsiChar(即拥有两倍的内存)的问题根本不算什么。引用你的标题,转化方向并不重要:它总是比没有转化慢得多。

如果您搜索速度,我怀疑 Mask.EditText 绝对是代码中的瓶颈。此方法将发送一条 GDI 消息,等待组件的响应,然后影响带有文本的字符串。如果(正如我怀疑的那样)您在循环中使用此 Mask.EditText 表达式,您最好在堆栈上使用临时变量。

关于delphi - 哪个受到的打击最大 : AnsiString to String or String to AnsiString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758617/

相关文章:

德尔福/TZipFile : how to restore the file's original timestamp?

delphi - 带有 Unicode 主题的 Indy 消息

delphi - 不兼容的类型 'String' 和 'TEdit'

mysql - Delphi 2009、MyDAC 和关系数据库

delphi - 如何将 D2009 .groupproj 文件转换为 D2006 .bdsgroup 文件?

rest - 在 Delphi REST 服务器中使用 POST 时无法获取查询参数的值

Python - 特殊字符产生不同的 CRC 结果

python - 关于优化此脚本的任何想法? (Python)

stored-procedures - Oracle 存储过程中的 Unicode

delphi - 当磁盘可用空间发生变化时如何收到通知?