奇怪的队列<T> .Enqueue(T item)代码

Fel*_* K. 13 .net c#

在反映ILSpy的同时,我在Queue<T>.Enqueue(T item)-method中找到了这行代码:

if (this._size == this._array.Length)
{
    int num = (int)((long)this._array.Length * 200L / 100L);
    if (num < this._array.Length + 4)
    {
        num = this._array.Length + 4;
    }
    this.SetCapacity(num);
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么有人会这样做?我认为这是一种整数溢出检查,但为什么先乘以200L然后除以100L

这可能是早期编译器的问题吗?

C.E*_*uis 4

通常先乘以然后除以 100 的东西是百分比计算 - 也许const XxxPercentage = 200原始代码中有一些类似的东西。编译器似乎没有优化* 200 / 100to * 2

此代码将容量设置为其大小的两倍 - 但如果其大小的两倍小于原始大小 + 4,请改用它。

它被转换为 long 的原因可能是因为如果将整数乘以“200%”,它会溢出。