1

次のように、オーバーロードされたインデクサーを持つ 2 次元の Matrix クラスを考えてみましょう。

public class Matrix
{
    private readonly double[,] _matrix;

    public double this[int i, int j]
    {
        get
        {
            return _matrix[i, j];
        }
        set
        {
            _matrix[i, j] = value;
        }
    }

    public double this[int i, int j]
    {
        get
        {
            if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
                throw new IndexOutOfRangeException("index was out of range");

            return _matrix[i, j];
        }
        set
        {
            if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
                throw new IndexOutOfRangeException("index was out of range");
            _matrix[i, j] = value;
        }
    }

    public double this[int i, int j]
    {
        get
        {
            if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1))
                return 0;
            return _matrix[i, j];
        }
        set
        {
            if (i >= 0 || i < _matrix.GetLength(0) || j >= 0 || j < _matrix.GetLength(1))
                _matrix[i, j] = value;
        }
    }
}

ご覧のとおり、インデクサーには 3 つのバージョンがあります。

1) このバージョンはインデックスをチェックしません

2) このバージョンはインデックスをチェックし、サイズを超えている場合は IndexOutOfRangeException をスローします。

3) このバージョンはインデックスをチェックし、インデックスが有効な場合にのみ値を割り当て/返します。

だから私の質問は、それらのどれを使用するのがベストプラクティスですか? あなたは何を好みますか、そしてその理由は何ですか? または、「MatrixIndexOutOfRange」のような新しいカスタム例外を作成して、IndexOutOfRange 例外の代わりにスローすることはできますか?

4

3 に答える 3

1

バージョン 1 と 2 は同じ動作をするため、バージョン 1 の方がコードが少ないため優れています。バージョン 2 を使用する場合は、null チェックを追加し、マトリックスが null の場合は例外をスローする必要があります。また、バージョン 1 で失敗する可能性のあるチェックをさらに追加する必要があります。

バージョン 3 では、作成したプログラミング エラーが隠されるだけで、デバッグに多くの時間がかかります。コード レビューでは、間違いなくコードをバージョン 1 に変更します。

于 2012-09-27T08:09:31.083 に答える
1

バージョン (1) が最適です。

配列double[,]自体が をスローするIndexOutOfRangeExceptionため、このテストを自分で行う価値はありません。

また、無効なパラメーター (バージョン 3) を暗黙のうちに受け入れることは、私の見解では脆弱です。

于 2012-09-27T08:03:11.960 に答える