如何为自定义矢量类使用数组初始化程序语法?

时间:2010-07-11 04:04:38

标签: c# .net arrays vector initializer

我有一个类粗略这样设计:

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 };

但这不是重点。 :)

谢谢!

3 个答案:

答案 0 :(得分: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);

涉及较少的工作(没有数组分配/初始化,没有操作员调用)。

答案 1 :(得分:1)

请求的整个要点是减少代码的总量。做{1,2,3}更方便。 C#不允许您重载运算符来执行此操作,或允许其他方式将数组初始值设定项用于自定义引用类型,这似乎很奇怪。

答案 2 :(得分:0)

有两个选项:

1)使用对象初始化语法:

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

2)创建一个带数组的contstructor:

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 );

你已经拥有。