将int转换为short的更好方法?(如果不可能,则为NULL)
本文关键字:不可能 如果不 如果 则为 NULL 转换 int short 方法 更好 | 更新日期: 2023-09-27 18:00:28
我有以下两种方法将int
转换为short?
。
- 如果值不在短范围内,则第一个将失败
- 第二种方法有效,但它有一个不必要的
conversion to string
有更好的方法吗?
编辑:
根据以下答案:
Int16只是Int32的一个子集,因此不需要转换为"中间"类型。
代码
//Approach 1
int vIn = 123456789;
short? vOut = Convert.ToInt16(vIn);
//Value was either too large or too small for an Int16.
//Approach 2
short? vOut2 = null;
int vIn2 = 123456789;
short number;
string characterRepresentationOfInt = vIn2.ToString();
bool result = Int16.TryParse(characterRepresentationOfInt, out number);
if (result)
{
vOut2 = number;
}
参考:
- Java:从int到short的转换
为什么不能简单地使用cast的内置转换?只需添加一个检查以确保它没有超出范围(如果您想要null
值而不是异常)。
short? ConvertToShort(int value)
{
if (value < Int16.MinValue || value > Int16.MaxValue)
return null;
return (short)value;
}
关于您的方法:
它是有效的(当然),但你永远不会得到
null
值,如果value
在Int16
的有效范围之外,转换可能会失败。速度非常慢。不要忘记
Int16
只是Int32
的一个子集,所以您不需要任何到"中间"类型的转换。
这里有几个可能的解决方案。
静态辅助方法:
public static class Number
{
public static bool TryConvertToShort(int value, out short result)
{
bool retval = false;
result = 0;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
retval = true;
}
return retval;
}
}
用法:
int a = 1234;
short b;
bool success = Number.TryConvertToShort(a, out b);
扩展方式:
public static class ExtendInt32
{
public static bool TryConvertToShort(this int value, out short result)
{
bool retval = false;
result = 0;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
retval = true;
}
return retval;
}
}
用法:
int a = 1234;
short b;
bool success = a.TryConvertToShort(out b);
您还可以创建一个助手/扩展方法,该方法不会正常失败,而是返回默认值(0)或引发异常。
public static short ConvertToShort(int value)
{
short result;
if (value > Int16.MinValue && value < Int16.MaxValue)
{
result = Convert.ToInt16(value);
}
else
{
throw new OverflowException();
}
return result;
}