0

クラスが単純で経験豊富なプログラマーには馬鹿げているように見えても、クラスが堅牢であることを確認したいと思います。

string []を受け取り、それを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を使用しようとすると、変数がスコープ内にないという問題があるようですが、stringArrayがnullのエラーをキャッチするには、変数をtry-catchに含める必要があります。

おそらく私はこれを使うべきですか?

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

しかし、エラーが発生した場合の対処方法がわかりません... null int []を返すか、例外をスローしますか?

(また、int.Parse(str)が失敗しないことを確認する必要があります-私はそれに到達していますが、try-catchブロックにあることを望んでいました!)

私が言ったように、これらは私があまりにも多くの悪い習慣を発達させる前に私が今試みて正しいことをしたい単純な仕事です。ありがとう。

4

8 に答える 8

1
  1. stringArrayがnullの場合、すぐにNullArgumentExceptionをスローします。
  2. 変換のためにもっと簡単なことを試してください:

    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 に答える
1

代わりに int.TryParse() を使用できます。

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

于 2012-07-04T09:27:10.183 に答える
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

キャッチブロックでカスタム例外をスローします。したがって、クラスのユーザーはこの例外をキャッチできます。

于 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

Try無効な入力に対して例外をスローする .NET Framework の多くのメソッドには、代わりにブール値を返す、通常は接頭辞が付いた非スローの対応するメソッドがあります。たとえば、 の場合、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 に答える