.net 为什么(uint)索引>=(uint)_size比索引>= _size更好?

roqulrg3  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(253)

我查看了List<T>的引擎盖,发现了以下代码:

public T this[int index] {
        get {
            // Following trick can reduce the range check by one
            if ((uint) index >= (uint)_size) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }
            Contract.EndContractBlock();
            return _items[index]; 
        }

        set {
            if ((uint) index >= (uint)_size) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }
            Contract.EndContractBlock();
            _items[index] = value;
            _version++;
        }
    }

在两个if语句中,index_size(类型为Int32)都被强制转换为UInt32,我知道这不是因为溢出,因为第一个if有一个注解,说明不是这样。

**问题:**除了溢出之外,将整数强制转换为无符号整数的概念是什么?它在什么特定情况下对开发人员有用?

2izufjch

2izufjch1#

关键是要在一个步骤中同时处理负数和正数。
如果将负数强制转换为uint,则结果肯定大于int.MaxValue。因此,任何负索引都将无法通过(uint) index >= (uint)_size检查。如果删除强制转换,则需要执行两项检查:index < 0 || index >= _size。由于演员阵容是“免费的”,这最终会提高一点性能。

相关问题