集合中“_version”的用途是什么?

What is the use of "_version" within collections?

我对集合很好奇,正在查看许多流行集合(列表、字典等)的源代码。我注意到他们中的很多人(全部?)在他们的代码中使用一个名为“_version”(或其变体)的整数,每次集合发生变化时都会添加该整数。它似乎在他们的 IEnumerator 实现中使用,检查 Enumerator 版本是否与集合的版本相同。

我的两个问题:

  1. 为什么普查员需要检查“版本”?什么会导致枚举器的版本与集合的版本不同?
  2. 制作自定义可枚举集合的人是否应该费心在他们的代码中实现他们自己的“_version”?

谢谢。

“_version”用于保持枚举器与集合同步。

有很好的解释:

Reference:

What changes the "version" of a list and thus invalidates all current enumerators?

Changing an element through the indexer

  • Add
  • AddRange
  • Clear
  • Insert
  • InsertRange
  • RemoveAll
  • RemoveAt
  • RemoveRange
  • Reverse
  • Sort

What would cause an Enumerator's version to be different from the collection's?

如果在创建枚举器后更改 collection。换句话说,_version 用于检查 collection 在您遍历它时是否已更改。

Should people making custom enumerable collections bother implementing their own "_version" in their code?

取决于您希望 collection 的“安全”程度。如果用户做了他们不应该做的事情,或者只是徘徊在 undefined-behavior 土地上,你想抛出异常吗?