从我的知识字符串中有1个基于Delphi,0个位置是为长度保留的。我负责用D5和D2006编写的一个巨大的应用程序,它通过从0索引复制来使用复制功能,并且几个同事也在这个时候以这种方式编码。因为这是一个Delphi'魔术'功能,我相信即使Copy用于从0索引复制字符串,在幕后它也会从位置1复制它。
对我来说,一个好的做法是从第一个位置复制一个字符串,而不是从0位置复制一个字符串,即使结果是相同的。
现在,我的问题是,通过使用0位置的复制功能而不是用于从1位复制来传递给其他Delphi版本时,应用程序会受到影响吗?
答案 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的。