我有一个类粗略这样设计:
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 };
但这不是重点。 :)
谢谢!
答案 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 );
你已经拥有。