是否有可能超载"阵列分配"对于自定义结构?

时间:2014-07-16 00:43:10

标签: c# arrays optimization struct overloading

这是一个非常简单的问题,如果我想在C#中指定新数组的确切值,我所做的就是:

foo[] arr = {10, 15, 24};

是否可以使用自定义结构执行此操作?

e.g。

public struct Vec3
{
    float[] MyVals;
    public float this[int a]
    {
        get
        {
            ...
        }
        set
        {
            ...
        } 
    }
}

public class MainRoutine
{
    public static Vec3 SuperVector = {2, 5, 6};

    .....

}

3 个答案:

答案 0 :(得分:1)

不是那样的。 C#不知道每个值应该映射到什么(想象你有一个更复杂的结构)。在一个数组(或任何其他集合,顺便说一句),它显而易见;提供的元素只是组成数组。

但是,你可以这样做:

public static Vec3 SuperVector = new Vec3
{
   MyVals = new float[]{2, 5, 6}
}

如果您将MyVals作为公共财产。当然,您也可以在构造函数(或数组)中传递元素。

有关对象初始值设定项的详细信息,请参阅MSDN

答案 1 :(得分:1)

做了类似的事

class Program
{
    public static Vec3 SuperVector = new Vec3 { 2, 5, 6 };

    static void Main(string[] args)
    {
        Console.WriteLine(SuperVector[0]);
        Console.WriteLine(SuperVector[1]);
        Console.WriteLine(SuperVector[2]);
        Console.ReadLine();
    }
}

public struct Vec3: IEnumerable
{
    List<float> MyVals;

    public float this[int a]
    {
        get
        {
            return MyVals[a];
        }
        set
        {
            InitiailaizeMyValIfEmpty();
            MyVals[a] = value;
        }
    }

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public void Add(float f)
    {
        InitiailaizeMyValIfEmpty();
        MyVals.Add(f);
    }

    private void InitiailaizeMyValIfEmpty()
    {
        if (MyVals == null)
            MyVals = new List<float>();
    }
}

答案 2 :(得分:1)

使用operator overloading可以执行此操作:

public struct Vec3
{
    private float[] MyVals;

    public float this[int a]
    {
        get { return MyVals[a]; }
        set { MyVals[a] = value; }
    }

    public static implicit operator float[](Vec3 vec)
    {
        return vec.MyVals;
    }
     public static implicit operator Vec3(float[] values)
     {
         var v = new Vec3();
         v.MyVals = values;
         return v;
     }
}

 public static Vec3 SuperVector = new[] { 2f, 5f, 6f };

ofcourse new[]new float[]的简写,这不完全是你想要的,但我认为它是最接近的。此数组初始化程序语法int[] arr = { 2, 3, 4 }只能用于数组,因此无论如何都不可能。