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
へ-1
の最初の呼び出しの前MoveNext
です。それは左側のリストの1つです。そして、への最後の呼び出しの後、MoveNext
を返すものFalse
は適切ではありませんFIndex
。Count
つまり、右側のリストから1つです。