我查看了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
有一个注解,说明不是这样。
**问题:**除了溢出之外,将整数强制转换为无符号整数的概念是什么?它在什么特定情况下对开发人员有用?
1条答案
按热度按时间2izufjch1#
关键是要在一个步骤中同时处理负数和正数。
如果将负数强制转换为
uint
,则结果肯定大于int.MaxValue
。因此,任何负索引都将无法通过(uint) index >= (uint)_size
检查。如果删除强制转换,则需要执行两项检查:index < 0 || index >= _size
。由于演员阵容是“免费的”,这最终会提高一点性能。