将int转换为short的更好方法?(如果不可能,则为NULL)

本文关键字:不可能 如果不 如果 则为 NULL 转换 int short 方法 更好 | 更新日期: 2023-09-27 18:00:28

我有以下两种方法将int转换为short?

  1. 如果值不在短范围内,则第一个将失败
  2. 第二种方法有效,但它有一个不必要的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;
}

参考:

  1. Java:从int到short的转换

将int转换为short的更好方法?(如果不可能,则为NULL)

为什么不能简单地使用cast的内置转换?只需添加一个检查以确保它没有超出范围(如果您想要null值而不是异常)。

short? ConvertToShort(int value)
{
    if (value < Int16.MinValue || value > Int16.MaxValue)
        return null;
    return (short)value;
}

关于您的方法:

  1. 它是有效的(当然),但你永远不会得到null值,如果valueInt16的有效范围之外,转换可能会失败。

  2. 速度非常慢。不要忘记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;
}