如何使用自定义向量类的数组初始值设定语法?

问题描述:

我有一个类大致设计成这样:如何使用自定义向量类的数组初始值设定语法?

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

我想通过实现一个类似于数组的初始化V ector3:

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

但是,没有类可以继承数组。此外,我知道我可以以某种方式设法得到这个微小的黑客:

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

但这不是重点。 :)

谢谢!

除了在数组中,没有定义使用数组初始值设定语法的语法。当你暗示,不过,你可以操作(或两个)添加到您的类型:

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

其中涉及较少的工作(没有阵列分配/初始化,没有操作员调用)。

+0

我说我可以在问题中已经有这个,但这不是我想要的。请仔细阅读。 ^^ – Lazlo 2010-07-12 16:10:30

+0

@Lazlo - 谢谢,但我*确实仔细阅读。这并没有改变这样一个事实:没有这样的黑客,你不能这样做。 – 2010-07-12 22:12:45

有2个选项:

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

你已经有了。

+0

+1用于对象初始化语法。另外,如果你的'Vector3'从一个类改成了一个结构体,那么这个语法就会调用默认的'Vector3'构造函数。作为一个值类型,编译器可以内联默认的构造函数;如果你每秒创造许多许多'Vector3's,这可能会有所帮助。参见:[Shawn Hargreaves博客:内联这些向量构造函数](http://blogs.msdn.com/b/shawnhar/archive/2007/01/02/inline-those-vector-constructors。aspx) – 2010-07-11 04:15:45

+0

这些都不会减少用户输入的代码量。 – Lazlo 2010-07-11 04:31:29

+0

@Lazlo正确的,因为我说你的构造函数可能没有一些聪明的黑客就可以获得。 – TJB 2010-07-11 04:49:41

请求的整个要点是减少代码的总量。做{1,2,3}更方便。看起来奇怪的是,C#不允许你重载操作符来做到这一点,或者允许另一种方式来利用数组初始化器来实现自定义引用类型。