0

ax、y、z の値を格納する「Vector」構造体があります。それらにアクセスしやすくするために、次のようなインデックス演算子を追加しました。

public struct Vector
{
    public double x;
    public double y;
    public double z;

    public double this[int i]
    {
        get
        {
            if(i == 0) return x;
            else if(i == 1) return y;
            else if(i == 2) return z;
            else throw new ArgumentOutOfRangeException("i", i, "Index must be 0, 1, or 2");
        }
        set
        {
            if (i == 0) x = value;
            else if (i == 1) y = value;
            else if (i == 2) z = value;
            else throw new ArgumentOutOfRangeException("i", i, "Index must be 0, 1, or 2");
        }
    }
}

注: 通常、x、y、z の代わりに配列を使用しますが、既存のコードを使用しているため、現時点でリファクタリングするのは困難です。

クラスで構造体を自動プロパティとして使用し、その xyz 値を変更しようとすると、次のようになります。

public Vector v{ get; set; }
void funct(){
    for(int i = 0; i < 3; i++)
    {
        v[i] = 3.0;
    }
}

コンパイラ エラーが発生します。

「変数ではないため、"v" の戻り値を変更できません」

私はエラーをグーグルで調べてみましたが、私がしたようにこれを行った人は誰もいないと思います (これはかなり興味深いケースだと思いますが、おそらく本当に醜いです)。この問題を解決する正しい方法は何でしょうか? このようにインデックス演算子を使用するのは間違っていますか?

注: はい、これが変更可能な構造体であることはわかっています。繰り返しますが、既存のコード

4

1 に答える 1

2

いくつかのオプションがあります:

  1. class代わりにstruct
  2. 最初に構造体値のコピーを取得し、それを変更してから元に戻します。

    Vector temp = v;
    for(int i = 0; i < 3; i++)
    {
        temp[i] = 3.0;
    }
    v = temp;
    
  3. 不変にして、ヘルパー/ファクトリー メソッドを追加します。

    public struct Vector
    {
        ....
    
        public Vector WithX(double x)
        {
            return new Vector(x, this.y, this.z);
        }
    

私は個人的にnbrに行きます。可変構造体としての 3 (これまで見てきたように) は、a** の苦痛です。

于 2013-11-06T12:30:42.717 に答える