1

次のプロパティは、getter と setter の両方に対して 1 回計算される値を要求するだけです。

したがって、代わりに:

public bool this[int x, int y]
{
    get
    {
        return this[x * this.width + y];
    }
    set
    {
        this[x * this.width + y] = value;
    }
}

これができればもっと良いです:

public bool this[int x, int y]
{
    int index = x * this.width + y;

    get
    {
        return this[index];
    }
    set
    {
        this[index] = value;
    }
}

この場合、それほど大したことではなく、インライン メソッドを使用できます。しかし、原則として、方法はありますか?

4

3 に答える 3

5

およびプロパティアクセサーは、実際には2つの独立したメソッドにコンパイルされますgetset共通のコードが必要な場合は、2つの異なるメソッドと同じ方法で、3番目のメソッド(おそらく静的なメソッド)を導入する必要があります。

private static CalculateIndex(int x, int width, int y)
{
    return x * width + y;
}

public bool this[int x, int y]
{
    get
    {
        return this[CalculateIndex(x, this.width, y)];
    }
    set
    }
        this[CalculateIndex(x, this.width, y)] = value;
    }
}

この場合、インデクサーのアクセサーに共通になるように変数を単純に設定することはできませんが、計算が非常に難しい場合は、何らかのキャッシュを使用できます。その場合は、アクセサーのキャッシュにアクセスします(indexあなたの例の変数のように)。これに伴う問題は、キャッシュが非常に重いソリューションであるということです。値がキャッシュされているかどうかのチェック、キャッシュされていない場合の計算、場合によってはキャッシュからの削除も処理する必要があります(特にメモリリークを回避するため)。

于 2012-12-04T16:30:38.797 に答える
1

計算を2回実行したくない場合は、ヘルパーメソッドを追加します。

int GetOffset(int x, int y)
{
    return x + this.width * y;
}

public bool this[int x, int y]
{
    get
    {
        return this[GetOffset(x, y)];
    }
    set
    {
        this[GetOffset(x, y)] = value;
    }
}
于 2012-12-04T16:31:59.263 に答える
-1

次のようなものかもしれません:

public bool this[int x, int y]
{    
    get
    {
        var index= x * this.width + y; //CALCULATE INDEX ON GET
        return this[index];
    }
    set
    {
        var index= x * this.width + y;//CALCULATE INDEX ON SET
        this[index] = value;
    }
}
于 2012-12-04T16:28:02.720 に答える