默认初始化创建struct对类对象的Array

时间:2011-09-26 11:23:27

标签: c# .net types

我知道struct是值类型,类是.Net中的引用类型。我想知道这里是否有更好的解决方案。

实施例,

public struct Holder
{
    public double Value { get; set; }

    public Holder()
    {
        this.Value = 0.0;
    }
}

此结构的用法:

void SomeFunction(int n)
{
    Holder[] valueHolders = new Holder[n];
    ...
    valueHolders[0].Value = someValue;
}

这完全没问题。现在只需将Holder更改为class即可。它抛出null对象引用,因为valueHolders将所有值都包含为null

现在我已将代码更改为

valueHolders[0] = new Holder();
valueHolders[0].Value = someValue;

工作正常。有没有办法像valueHolders类型一样在struct中同时创建所有元素。

1 个答案:

答案 0 :(得分:0)

C#需要显式初始化引用类型。这可以在一个循环中很容易地完成:

Holder[] valueHolders = new Holder[n];
for (int i = 0; i < n; i++)
{
    valueHolders[i] = new Holder();
}

您可以更进一步,并在您的类上公开一个静态方法,如下所示:

public class Holder    {
    static public Holder[] InitArray(ulong length) {
        Holder[] holders = new Holder[length];
        for (ulong i = 0; i < length; i++) {
            holders[i] = new Holder;
        }
        return holders;
    }
}

...

var valueHolders = Holder.InitArray(n);

您可以使用通用扩展方法更进一步:

public static class ArrayInitializer
{
    public static T[] Init<T>(this T[] array) where T : new()
    {
        for(int i = 0; i < array.Length; i++)
        {
            array[i] = new T();
        }
        return array;
    }
}

...

var valueHolders = new Holder[n].Init();
相关问题