德爾福枚舉的規範MoveNext的是這樣寫的:規範的枚舉器MoveNext函數中是否需要if語句?
function TListEnumerator.MoveNext: Boolean;
begin
Result := FIndex < FList.Count - 1;
if Result then
Inc(FIndex);
end;
這是整個RTL採用的形式,VCL等等。這種形式似乎是普遍在3 次黨代碼也。
我認爲它可以更簡單地寫成這樣:
function TListEnumerator.MoveNext: Boolean;
begin
Inc(FIndex);
Result := FIndex < FList.Count;
end;
有沒有什麼好的理由不能用簡單的形式?
我的推理如下。一旦MoveNext
返回False
,Current
屬性永遠不會再次訪問。 FIndex
不在列表的末尾,因爲它不再被使用。在循環中的爲實際執行這樣的:
while Enumerator.MoveNext do
Enumerator.Current.DoSomething;
事實上,它實際上使我更有意義的是FIndex
去出界。這意味着如果任何人使用手寫枚舉器代碼,那麼他們將得到範圍檢查錯誤的情況下,Current
訪問MoveNext
返回False
後訪問。
更重要的是,FIndex
是-1
之前的第一個電話MoveNext
。這是左邊列表中的一個。在最後致電MoveNext
後,返回False
的那個,FIndex
是Count
這是不合適的,這是右邊列表中的一個。
在你的版本中,你可以用'FIndex'跳出界限,不是嗎? – TLama
@TLama一旦'MoveNext'返回'False',你就不會調用'GetCurrent'。如果你這樣做,出界就是你想要的。你不想再次獲得最後一個項目。在我看來,這是'FIndex'爲'-1'的初始狀態的鏡像。 –
在我的評論最後,你不*你的原因只是因爲我根本不知道「TListEnumerator」及其意圖。我只是希望在你的弱點... – TLama