Delphi - System.Copy良好实践

时间:2012-03-22 14:29:10

标签: delphi delphi-2006 delphi-5

从我的知识字符串中有1个基于Delphi,0个位置是为长度保留的。我负责用D5和D2006编写的一个巨大的应用程序,它通过从0索引复制来使用复制功能,并且几个同事也在这个时候以这种方式编码。因为这是一个Delphi'魔术'功能,我相信即使Copy用于从0索引复制字符串,在幕后它也会从位置1复制它。

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

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

1 个答案:

答案 0 :(得分:2)

当将{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的。