C# 修改内置.NET集合int.MaxValue次及以上-潜在溢出错误

C# 修改内置.NET集合int.MaxValue次及以上-潜在溢出错误,c#,.net,iteration,reliability,C#,.net,Iteration,Reliability,回到.NETReflector免费的时候,我用它来浏览.NETFramework代码。我注意到,.NET 2.0中的大多数集合(我相信这也适用于当前版本)在循环期间使用以下机制来识别集合修改: public class SomeCollection<T> { internal int version = 0; // code skipped for brevity public void Add(T item) { version+

回到.NETReflector免费的时候,我用它来浏览.NETFramework代码。我注意到,.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...
     }
}
公共类集合
{
内部int版本=0;
//为简洁起见,跳过了代码
公共作废新增(T项)
{
版本++;
//添加项逻辑。。。
}
公共IEnumerator GetEnumerator()
{
返回新的SomeCollectionEnumerator(此);
}
}
公共类SomeCollectionEnumerator:IEnumerator
{
私人收藏;
私有int版本;
公共SomeCollectionEnumerator(SomeCollection集合)
{
this.version=collection.version;
this.collection=collection;
}
公共图书馆
{
if(this.version!=this.collection.version)
{
//在上迭代时修改了集合
抛出一些异常(…);
}
//这里的迭代逻辑。。。
}
}
现在想象一下一个长期运行的应用程序(一个大量使用的web服务,必须有最少的停机时间,并且应该是稳定可靠的)的假设情况,它将给定的集合实例(在.NET framework中内置的集合类型之一)在内存中保持运行时间。集合的修改频率足够高,因此可以进行
int.MaxValue
修改。集合的每个修改方法中的
version++
行是否存在引发溢出异常的风险(假设溢出检查未全局禁用)


我必须承认,我对反射代码的细节记忆犹新,但我不记得在
version++
操作周围使用
unkecked
块。这是否意味着.NET中的内置集合类型不适合这种长时间运行的应用程序场景?出于好奇,是否有人遇到过实际情况下可能会发生这种情况?

没有,因为c#编译器会进行整数运算(包括编译后的BCL)。

dotPeek()是一个免费的好的反编译器,以防反射器的故事在你嘴里留下酸味。还有BCL源代码(以及大多数其他MSFT.NET库)在@spender上共享并可用谢谢,对我来说,这种感觉更像是被蒙蔽了双眼,而不是有酸味,但我想我们的意思都是一样的。今天要学习的另一件有用的东西是——一个新的反编译工具,即使是jetbrainsILSpy提供的,仍然是免费的,而且既然它是开源的,它是否应该有一个35美元的价格标签和一个定时炸弹上一次免费更新,你可以直接进行。很好,我不知道。我想我可以放心地编写一个应用程序,有一天可以对
int.MaxValue
集合进行修改:)谢谢你的快速回复。