3

私は大まかにそのように設計されたクラスを持っています:

class Vector3
{
    float X;
    float Y;
    float Z;

    public Vector3(float x, float y, float z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
}

私はそれをプロパティとして実装する他のクラスを持っています、例えば:

class Entity
{
    Vector3 Position { get; set; }
}

ここで、エンティティの位置を設定するために、次を使用します。

myEntity.Position = new Vector3(6, 0, 9);

Vector3に配列のような初期化子を実装することで、ユーザーのためにこれを短縮したいと思います。

myEntity.Position = { 6, 0, 9 };

ただし、どのクラスも配列を継承できません。さらに、私はマイナーなハックでこれをどうにかして得ることができることを知っています:

myEntity.Position = new[] { 6, 0, 9 };

しかし、これはここでのポイントではありません。:)

ありがとう!

4

3 に答える 3

3

配列を除いて、配列初期化構文を使用するための定義された構文はありません。ただし、ヒントとして、タイプに演算子(または2つ)を追加できます。

    public static implicit operator Vector3(int[] value)
    {
        if (value == null) return null;
        if (value.Length == 3) return new Vector3(value[0], value[1], value[2]);
        throw new System.ArgumentException("value");
    }
    public static implicit operator Vector3(float[] value)
    {
        if (value == null) return null;
        if (value.Length == 3) return new Vector3(value[0], value[1], value[2]);
        throw new System.ArgumentException("value");
    }

次に、次を使用できます。

obj.Position = new[] {1,2,3};

など。ただし、個人的には、次のようにそのままにしておきます。

obj.Position = new Vector3(1,2,3);

これにより、作業が少なくて済みます(配列の割り当て/初期化、オペレーターの呼び出しはありません)。

于 2010-07-11T07:36:14.563 に答える
1

リクエストの全体的なポイントは、コードの全体量を減らすことです。{1、2、3}を実行する方が簡単です。C#で演算子をオーバーロードしてこれを実行したり、カスタム参照型に配列初期化子を利用する別の方法を許可したりできないのは奇妙に思えます。

于 2010-07-11T04:22:45.667 に答える
0

2つのオプションがあります:

1)オブジェクト初期化構文を使用します。

myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 };

2)配列を取るコンストラクターを作成します。

Vector3( float[] array )
{
  // Validate, set X = array[0] etc.
}

myEntity.Position = new Vector3( new float[3]{ 6, 0, 9} );

どちらかがただより簡単かどうかはわかりません

myEntity.Position = new Vector3( 6, 0, 9 );

あなたはすでに持っています。

于 2010-07-11T04:11:26.070 に答える