我有一个类,粗略地说,是这样设计的:
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 };但这不是重点。:)
谢谢!
发布于 2010-07-11 07:36:14
除了数组中,没有定义的语法可以使用数组初始化器语法。不过,正如您所暗示的,您可以在您的类型中添加一个运算符(或两个):
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-11 04:22:45
请求的全部目的是减少代码的总体数量。做{ 1,2,3 }更方便。奇怪的是,C#不允许您重载操作符来执行此操作,也不允许使用另一种方法将数组初始化器用于自定义引用类型。
发布于 2010-07-11 04:11:26
有两种选择:
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 );你已经有了。
https://stackoverflow.com/questions/3221819
复制相似问题