0

我想确保我的类是健壮的——即使它们很简单并且对于有经验的程序员来说似乎很愚蠢。

假设我有一个如下所示的方法,它接受一个字符串 [] 并将其作为一个 int [] 返回。

public static int[] GetIntArrayFromStringArray(string[] stringArray)
    {
        int i = 0;
        int[] ints = new int[stringArray.Length];
        foreach (var str in stringArray)
        {
            ints[i++] = (str != "" ? int.Parse(str) : 0);
        }
        return ints;
    }

使用 try-catch 并抛出异常的最佳选择是什么?当我尝试使用 try-catch 时,我的变量似乎不在范围内,但我需要它们在 try-catch 中以捕获 stringArray 为空的任何错误!

也许我应该使用这个?

    if (stringArray == null) //do something ...

但不确定发生错误时该怎么办......我是返回 null int[] 还是抛出异常?

(我还必须检查 int.Parse(str) 是否失败 - 我正在处理那个但希望它可能在 try-catch 块中!)

正如我所说,这些都是简单的任务,我想在我养成太多坏习惯之前尝试并改正。谢谢。

4

8 回答 8

1

您可以改用 int.TryParse() 。

http://msdn.microsoft.com/en-us/library/f02979c7.aspx

于 2012-07-04T09:27:10.183 回答
1
  1. 如果stringArray为 null,则立即抛出NullArgumentException
  2. 尝试一些更简单的转换:

    return stringArray.Select(s => IntParseOrDefault(s, 0)).ToArray();

IntParseOrDefault就像这样:

int IntParseOrDefault(string s, int defaultVal)
{
    int i;
    if (!int.TryParse(s, out i)) i = defaultVal;
    return i;
}

如果您希望方法在任何字符串不是有效整数时失败,则不要使用默认值,而是在TryParse失败时抛出InvalidArgumentException 。

于 2012-07-04T09:29:52.753 回答
0

这里有一个例子

        foreach (string str in stringArray)
        {
            int nr = 0;
            int.TryParse(str, out nr);

            if (nr > 0)
                ints[i++] = nr;
        }

这是完整的代码

public static int[] GetIntArrayFromStringArray(string[] stringArray)
{
    if (stringArray == null || stringArray.Length == 0)
        throw new ArgumentNullException("string array is null or empty");

    int i = 0;
    int[] ints = new int[stringArray.Length];
    foreach (var str in stringArray)
    {
        int nr = 0;
        int.TryParse(str, out nr);
        if (nr > 0)
            ints[i] = nr;
        i++;
    }
    return ints;
}
于 2012-07-04T09:28:59.223 回答
0

以下是使用 try - catch 的方法:

public static int[] GetIntArrayFromStringArray(string[] stringArray)
{
    int i = 0;
    int[] ints = null;
    try {
        ints = new int[stringArray.Length];
        foreach (var str in stringArray)
        {
            ints[i++] = (str != "" ? int.Parse(str) : 0);
        }
    }
    catch {
         // Throw custom exception
    }
return ints;
}
于 2012-07-04T09:30:14.217 回答
0

我会在 catch-block 中抛出一个自定义异常。因此,您班级的用户可以捕获此异常。

于 2012-07-04T09:31:38.203 回答
0
public static int[] GetIntArrayFromStringArray(string[] stringArray)
    {
        int i = 0;
        int[] ints;
        int num;
        if (stringArray == null && stringArray.Length > 0)
        {
        ints = new int[stringArray.Length]
        foreach (var str in stringArray)
        {
            if (string.IsNullOrEmpty(str) && int.TryParse(str, num))
            {
            ints[i++] = num;
            }  
        }
        }
        return ints;
    }
于 2012-07-04T09:32:19.673 回答
0
    public static int[] GetIntArrayFromStringArray(string[] stringArray)
    {
        if (stringArray == null)
        {
            throw new ArgumentNullException("stringArray");
        }

        int count = stringArray.Length;
        int[] ints = new int[count];
        for (int i = 0; i < count; i++)
        {
            int intValue;
            ints[i] = int.TryParse(stringArray[i], out intValue) ? intValue : 0;
        }
        return ints;
    }
于 2012-07-04T09:32:25.980 回答
0

.NET Framework 中的许多在无效输入上引发异常的方法都有非引发对应项,通常以 为前缀Try,而是返回一个布尔值。例如,在 的情况下int.Parse,您可以更轻松地调用int.TryParse,例如:

public static int[] GetIntArrayFromStringArray(string[] stringArray)
{
    int i = 0;
    int[] ints = new int[stringArray.Length];
    foreach (var str in stringArray)
    {
        int a = 0
        int.TryParse(str, out a)
        ints[i++] = a;
    }
    return ints;
}
于 2012-07-04T09:33:18.453 回答