4

C# では、値を返さないコード パスが存在することがありますが、コンパイラがエラーを出して修正できるのは良いことです。ただし、STRUCTURALLY が存在しない場所がある場合もありますが、ALOGIRTHM はその構造が発生するのを防ぎます。

これは単純な考案された例です。

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
    }

もちろん、私の「アルゴリズム」はばかげていて、2 番目のテストは冗長であり、そうするべきだと人々は言うでしょう。

public static int test1(bool a)
    {
        if (a) return 1;
        else return 2;
    }

あるいは

public static int test1(bool a)
    {
        if (a) return 1;
        return 2;
    }

この問題に具体的に焦点を当てたいので、実際のアルゴリズムではなく、この単純な「冗長な」例を意図的に選択します。アルゴリズムを記述できる約10の異なる方法ではありません:)

では、これに対処するための可能な方法と、それぞれの長所と短所は何ですか。

1) は先ほど説明したもので、それがアルゴリズムのリファクタリングです。これが不可能な場合もあれば、最終結果がフォルマントどおりでなく、読みやすく、理解しやすく、保守しにくい場合もあります。

もう1つは、nullなど、決して起こらない何かを返すことです..しかし、この場合、私は整数を扱っているので、0を入力する必要があります。

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
        //this code never happens, but i need to keep the compiler happy
        return 0;
    }

または例外を使用する

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
        throw new Exception("this code never happens, but i need to keep the compiler happy");
    }

しかし、これに対処するたびに、どんなテクニックを使用しても、結果に満足できず、少し汚いと感じます.

代替手段はありますか?

4

5 に答える 5

3

すべてのコード パスが値を返さないというコンパイル エラーが発生した場合、設定または「トリック」するフラグがないため、デフォルト値を返すか、例外をスローする必要があります。私は、InvalidOperationException (「予期しないコードに到達しました。このメソッドは正しく変更されていません」) をスローすることを固く信じています。

汚れていない理由: 他の誰かがやって来て、例外がスローされる原因となる変更を行った場合、例外の作成者が根本的に間違っていると見なしたことを行ったことがわかります。デフォルト値を返すと、メソッドのコンシューマーが静かに壊れる可能性があるため、セーフティ ネットとして例外を使用することをお勧めします。

于 2013-08-16T19:11:27.837 に答える
0

変数を使用して値を代入し、関数の最後でその値を返します。

private bool isValid() 
{
bool result = false;
try {
    //some code 
    result = true;
    } catch {
    result = false;
    }
return result;
}
于 2013-08-16T19:20:05.490 に答える
0

この場合に検討できるもう 1 つのオプションは、Debug.Fail()メソッドを使用することです。

public static int test1()
{
    if (myComplexAlgo()) return 1;
    if (myCatchAllAlgo()) return 2;
    Debug.Fail("I should never be here!");
    return -1;
}

すべての人に適しているわけではありません。この方法の利点は、本番コードをクラッシュさせることなく、テストが失敗することを確認できることです。これにより、アルゴリズムや条件が変更された場合に、コード内の将来の問題を (うまくいけば) キャッチできます。

于 2013-08-16T19:25:18.840 に答える