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

时间:2013-02-22 13:22:47

标签: c# .net

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

  1. 如果值不在短程范围内,则第一个失败。
  2. 第二种方法有效,但它有一个不必要的conversion to string
  3. 有更好的方法吗?

    修改

    从下面的答案:

      

    Int16只是Int32的一个子集,因此您无需转换为“中间”类型。

    CODE

    //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: Conversion from int to short

2 个答案:

答案 0 :(得分:8)

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

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

    return (short)value;
}

关于您的方法:

  1. 它有效(当然),但如果null超出value的有效范围,您将永远无法获得Int16值,转换可能会失败。

  2. 速度非常慢。不要忘记Int16只是Int32的一个子集,因此您无需转换为“中间”类型。

答案 1 :(得分:1)

以下是一些可能的解决方案。

静态辅助方法:

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;
}