使用默认构造函数初始化数组

时间:2011-01-29 21:15:46

标签: c# arrays default-constructor array-initialize

public class Sample
{
     static int count = 0;
     public int abc;
     public Sample()
     {
        abc = ++Sample.count;
     }
}

我想创建一个上面的类数组,并希望通过调用默认构造函数来初始化数组中的每个元素,这样每个元素可以有不同的abc。所以我这样做了:

Sample[] samples = new Sample[100];

但这不符合我认为它应该做的事情。这似乎是默认构造函数没有被调用。如何在创建数组时调用默认构造函数?

我也想知道上述陈述是做什么的?

6 个答案:

答案 0 :(得分:42)

基本上,你不能。创建数组时,它始终最初使用该类型的默认值进行填充 - 对于类,该类始终为空引用。对于int,它为0,对于bool,它为假,等等。

(如果使用数组初始化程序,那将创建“空”数组,然后使用您指定的值填充它。)

通过调用构造函数可以通过各种方式填充数组 - 我希望可能自己使用foreach循环。使用带有Enumerable.Range / Repeat的LINQ感觉有点强迫。

当然,您总是可以编写您自己的填充方法,即使是作为扩展方法:

public static T[] Populate<T>(this T[] array, Func<T> provider)
{
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = provider();
    }
    return array;
}

然后你可以使用:

Sample[] samples = new Sample[100].Populate(() => new Sample());

我喜欢这个解决方案:

  • 它仍然是单个表达式,在各种情况下都很有用
  • 它没有介绍您实际不想要的概念(如重复单个值或创建范围)

当然你可以添加更多选项:

  • 带有Func<int, T>而不是Func<T>的重载,将索引传递给提供者
  • 创建数组的非扩展方法填充它

答案 1 :(得分:8)

您的代码只会创建数组,但不会创建任何项目。基本上,您需要Sample 的实例存储到此数组中。

简单来说,没有任何花哨的LINQ等。:

Sample[] samples = new Sample[100];
for (int i = 0; i < samples.Length; i++) samples[i] = new Sample();

另请注意,您的解决方案是线程安全的。

答案 2 :(得分:4)

无法自动执行此操作;数组初始化本质上是“将这块内存擦除为0”。你必须做类似的事情:

var arr = new SomeType[size];
for(int i = 0 ; i < size ; i++) arr[i] = new SomeType();

答案 3 :(得分:2)

问题是通过声明该数组,您从未为每个对象分配空间。您只为100个Sample类型的对象分配了空间。你必须自己调用构造函数。

详细说明:

Food[] foods = Food[100];
for (int k = 0; k < foods.length; k++) {
   foods[k] = new Food();
}

一个有趣的工作可能是工厂功能。考虑将其附加到Sample类。

public static Sample[] getInstances(int aNumber) {
    Sample[] sample = Sample[aNumber];
    for (int k = 0; k < sample.length; k++) {
       sample[k] = new Sample();
    }

    return sample;
}

稍微隐藏瑕疵 - 这对你来说是一个很有用的功能。

答案 4 :(得分:2)

此时你有一个100号的空数组,如果你想用项目填充它,那么你必须做类似的事情:

for(int i=0; i<samples.Length; i++) {
   samples[i] = new Sample();
}

答案 5 :(得分:1)

这是另一个不需要任何扩展方法的单行:

Sample[] array = Enumerable.Range(0, 100).Select(i => new Sample()).ToArray();

另一个不错的选择是Scott's suggestionJon's answer

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

所以你可以这样做:

Sample[] array = new Sample[100].Populate();