首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对自定义向量类使用数组初始化器语法?

如何对自定义向量类使用数组初始化器语法?
EN

Stack Overflow用户
提问于 2010-07-11 04:04:38
回答 3查看 1.6K关注 0票数 3

我有一个类,粗略地说,是这样设计的:

代码语言:javascript
复制
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;
    }
}

我有其他类将其实现为属性,例如:

代码语言:javascript
复制
class Entity
{
    Vector3 Position { get; set; }
}

现在,要设置实体的位置,我使用以下方法:

代码语言:javascript
复制
myEntity.Position = new Vector3(6, 0, 9);

我想通过为Vector3实现类似数组的初始化器来缩短用户的时间:

代码语言:javascript
复制
myEntity.Position = { 6, 0, 9 };

但是,没有一个类可以继承数组。此外,我知道我可以设法用一些小技巧来实现这个目标:

代码语言:javascript
复制
myEntity.Position = new[] { 6, 0, 9 };

但这不是重点。:)

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-11 07:36:14

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

代码语言:javascript
复制
    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");
    }

然后你可以使用:

代码语言:javascript
复制
obj.Position = new[] {1,2,3};

然而,就我个人而言,我会把它放在一边,因为:

代码语言:javascript
复制
obj.Position = new Vector3(1,2,3);

这就减少了工作量(没有数组分配/初始化,没有操作符调用)。

票数 3
EN

Stack Overflow用户

发布于 2010-07-11 04:22:45

请求的全部目的是减少代码的总体数量。做{ 1,2,3 }更方便。奇怪的是,C#不允许您重载操作符来执行此操作,也不允许使用另一种方法将数组初始化器用于自定义引用类型。

票数 1
EN

Stack Overflow用户

发布于 2010-07-11 04:11:26

有两种选择:

1)使用对象初始化语法:

代码语言:javascript
复制
myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 };

2)创建一个包含数组的构造器:

代码语言:javascript
复制
Vector3( float[] array )
{
  // Validate, set X = array[0] etc.
}

myEntity.Position = new Vector3( new float[3]{ 6, 0, 9} );

我不确定这两种方法是否比

代码语言:javascript
复制
myEntity.Position = new Vector3( 6, 0, 9 );

你已经有了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3221819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档