作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Delphi枚举器中的规范MoveNext编写如下:
function TListEnumerator.MoveNext: Boolean;
begin
Result := FIndex < FList.Count - 1;
if Result then
Inc(FIndex);
end;
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
之前,
-1
是
MoveNext
。那是左边列表中的一个。在最后一次调用
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/
我是一名优秀的程序员,十分优秀!