如何使用自定义向量类的数组初始值设定语法?
我有一个类大致设计成这样:如何使用自定义向量类的数组初始值设定语法?
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);
其中涉及较少的工作(没有阵列分配/初始化,没有操作员调用)。
有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);
你已经有了。
+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
这些都不会减少用户输入的代码量。 – Lazlo 2010-07-11 04:31:29
@Lazlo正确的,因为我说你的构造函数可能没有一些聪明的黑客就可以获得。 – TJB 2010-07-11 04:49:41
请求的整个要点是减少代码的总量。做{1,2,3}更方便。看起来奇怪的是,C#不允许你重载操作符来做到这一点,或者允许另一种方式来利用数组初始化器来实现自定义引用类型。
我说我可以在问题中已经有这个,但这不是我想要的。请仔细阅读。 ^^ – Lazlo 2010-07-12 16:10:30
@Lazlo - 谢谢,但我*确实仔细阅读。这并没有改变这样一个事实:没有这样的黑客,你不能这样做。 – 2010-07-12 22:12:45