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

除了 in 数组,没有定义使用数组初始值设定项语法的语法。但是,正如您所暗示的,您可以在您的类型中添加一个(或两个)运算符:

    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 回答