(UInt16)i vs Convert.ToUInt16(i)



我有一个在UInt16范围内Int32。我应该使用哪种方法将其更改为UInt16?是否有理由使用一个而不是另一个,或者没关系?任何陷阱(例如,投掷float会截断,转换会四舍五入(?

Int32 int32 = 2;
UInt16 a = (UInt16)int32;
UInt16 b = Convert.ToUInt16(int32);

以下是Convert.ToUInt16(int value)的完整来源:

[CLSCompliant(false)]   
public static ushort ToUInt16(int value) {
if (value < 0 || value > UInt16.MaxValue) 
throw new OverflowException(Environment.GetResourceString("Overflow_UInt16"));
Contract.EndContractBlock();
return (ushort)value;
}

看起来无论如何它都解析为演员表。

Convert.ToUInt16(int)实现为:

public static ushort ToUInt16(int value)
{
if (value < 0 || value > 65535)
{
throw new OverflowException(Environment.GetResourceString("Overflow_UInt16"));
}
return (ushort)value;
}

如您所见,它只是在进行直接投射之前检查边界。 所以,如果你知道你的整数在UInt16的范围内,那么只需强制转换并避免冗余检查。

(我通过使用ILSpy获得了实现 - 它是免费的(

我认为区别在于,如果值超出目标类型的范围,Convert 将引发异常,而这种情况只会丢失信息。

Int32 a = Int32.MaxValue;
UInt16 b = (UInt16)a;
Console.WriteLine(b); // Outputs 65535
UInt16 c = Convert.ToUInt16(a); // Throws OverflowException

效率方面,在 LinqPad 中检查 IL,生成的代码大小没有区别。将调用转换为类库方法,强制转换使用本机 IL 命令,因此如果不太安全,则可能更有效。

最新更新