Когда-то, когда.NET Reflector был бесплатным, я использовал его, чтобы погрузиться в код.NET framework. Я обратил внимание, что большинство коллекций в.NET 2.0 (Я считаю, что это применимо и к текущим версиям )используют следующий механизм для распознавания модификаций коллекций во время циклов:
public class SomeCollection<T>
{
internal int version = 0;
// code skipped for brevity
public void Add(T item)
{
version++;
// add item logic...
}
public IEnumerator<T> GetEnumerator()
{
return new SomeCollectionEnumerator<T>(this);
}
}
public class SomeCollectionEnumerator<T> : IEnumerator<T>
{
private SomeCollection<T> collection;
private int version;
public SomeCollectionEnumerator(SomeCollection<T> collection)
{
this.version = collection.version;
this.collection = collection;
}
public bool MoveNext()
{
if (this.version != this.collection.version)
{
// collection was modified while iterated over
throw SomeException(...);
}
// iteration logic here...
}
}
Теперь представьте гипотетический случай долго работающего приложения (интенсивно используемого веб-сервиса, который должен иметь минимальное время простоя и должен быть стабильным и надежным ), который хранит заданный экземпляр коллекции (один из встроенных -в коллекцию типы в.NET framework )в памяти до тех пор, пока он работает. Коллекция модифицируется достаточно часто, так что модификации int.MaxValue
возможны.Существует ли риск того, что строка version++
в каждом методе модификации коллекции вызовет исключение переполнения (, предполагая, что проверки переполнения не отключены глобально ).
Я должен признать, что плохо помню детали отраженного кода, но я не помню использования unckecked
блоков вокруг version++
операций. Означает ли это, что встроенные -типы коллекций в.NET не подходят для такого долгого -времени работы приложения? Просто из любопытства, сталкивался ли кто-нибудь с реальным -жизненным сценарием, где это могло произойти на самом деле?