Delphi - System.Copy 良好实践

标签 delphi delphi-2006 delphi-5

据我所知,Delphi 中的字符串是 1,0 位置是为长度保留的。我负责一个用D5和D2006编写的庞大应用程序,它正在使用复制功能,从0索引开始复制,而几个同事此刻也在这样编码。因为这是 Delphi 的“神奇”功能,所以我相信即使使用 Copy 从 0 索引复制字符串,在幕后它也会从位置 1 复制它。

对我来说,一个好的做法是从第 1 个位置复制字符串,而不是从 0 个位置复制,即使结果是相同的。

现在,我的问题是,通过使用从 0 位置复制功能而不是从 1 位置复制功能传递到其他 Delphi 版本时,应用程序是否会受到影响?

最佳答案

当将 0 作为 Index 参数传递给字符串的 Copy 时,Delphi RTL 会忽略您。当您为 Index 传递 0 或更少值时,RTL 使用值 1。所以你所做的事情是良性的,因为传递 1 或任何小于 1 的值之间没有明显的行为差异。但是,在 Delphi 和我中使用 0 作为字符串索引肯定会令人困惑建议不要这样做。

在伪代码中,Copy 的实现如下所示:

function Copy(s: string; Index, Count: Integer): string;
begin
  if Index<1 then
    Index := 1;
  dec(Index);//convert from 1-based to 0-based indexing
  ....continues

事实上,实际的实现有点复杂,但上面的伪代码给出了正确的语义。

您关于存储在索引 0 处的长度的评论对于旧式短字符串来说是正确的。但对于长字符串则不然。事实上,正是这个事实导致了相当奇怪的情况,即字符串是从 1 开始的,但动态数组、列表等是从 0 开始的。

关于Delphi - System.Copy 良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824294/

相关文章:

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

delphi - 我的 Delphi 应用程序完成初始化后,我应该在哪里放置要执行的代码?

delphi - 如何在Delphi中连续运行视频文件?

delphi - 如何在 EExternal 异常期间获取 EXCEPTION_POINTERS?

delphi - 学习支持 Delphi 的最快方法是什么?

windows - 如何从Delphi代码的IShellItem2.GetProperty输出中获取FindData结构?

sql - 为什么 "insert (...) values (...)"不能插入新行?

delphi - 在 PC 之间共享 Delphi 中的公共(public)内存区域

delphi - 如何远程获取正在运行的进程列表?

delphi - 如何查看我们在亚历山大信任的项目?