gpt4 book ai didi

delphi - 规范枚举器MoveNext函数中是否需要if语句?

转载 作者:行者123 更新时间:2023-12-03 19:04:31 24 4
gpt4 key购买 nike

Delphi枚举器中的规范MoveNext编写如下:

function TListEnumerator.MoveNext: Boolean;
begin
Result := FIndex < FList.Count - 1;
if Result then
Inc(FIndex);
end;


这是整个RTL,VCL等中使用的表格。该表格似乎在第三方代码中也很普遍。

我认为可以这样写:

function TListEnumerator.MoveNext: Boolean;
begin
Inc(FIndex);
Result := FIndex < FList.Count;
end;


是否有充分的理由无法使用较简单的形式?



我的推理如下。一旦 MoveNext返回 False,就不再访问 Current属性。没关系, FIndex不在列表末尾,因为不再使用它。 for in循环实际上是这样实现的:

while Enumerator.MoveNext do
Enumerator.Current.DoSomething;


实际上,对我来说 FIndex越界越有意义。这意味着,如果有人使用手写的枚举器代码,则在 Current返回 MoveNext之后访问 False的情况下,他们将获得范围检查错误。

此外,在第一次调用 FIndex之前, -1MoveNext。那是左边列表中的一个。在最后一次调用 MoveNext之后,返回 False的调用不适合将 FIndex设置为 Count的情况,这不在右边的列表中。

最佳答案

您假设TListEnumerator仅在for循环中使用。尽管那是迄今为止最常见的情况,但建议的版本可能会出现异常。在已经返回MoveNext一次之后再次调用False很好。如果继续调用MoveNext直到返回True,则必须得到一个无限循环,并且使用建议的版本,该循环将不会无限循环,一旦超过FIndex = MaxInt情况,它将终止。

请参阅IEnumerator.MoveNext的文档,该文档基于Delphi的实现(IIRC,它实际上首先在现已消失的Delphi .NET中可用):


当枚举器位于此位置时,对MoveNext的后续调用也将返回false,直到调用Reset。

关于delphi - 规范枚举器MoveNext函数中是否需要if语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com