默认初始化,创建一个结构体与类对象的数组

本文关键字:结构体 对象 数组 一个 初始化 创建 默认 | 更新日期: 2023-09-27 18:09:55

我理解结构是值类型,类是。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类型时所做的那样

默认初始化,创建一个结构体与类对象的数组

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();