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

Naw*_*waz 19 c# arrays array-initialize default-constructor

public class Sample
{
     static int count = 0;
     public int abc;
     public Sample()
     {
        abc = ++Sample.count;
     }
}
Run Code Online (Sandbox Code Playgroud)

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

Sample[] samples = new Sample[100];
Run Code Online (Sandbox Code Playgroud)

但这并不符合我的想法.这似乎是默认构造函数没有被调用.如何在创建数组时调用默认构造函数?

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

Jon*_*eet 44

基本上你不能.创建数组时,它始终最初使用该类型的默认值进行填充 - 对于类,该类始终为空引用.因为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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

Sample[] samples = new Sample[100].Populate(() => new Sample());
Run Code Online (Sandbox Code Playgroud)

我喜欢这个解决方案:

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

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

  • 一个重载,它Func<int, T>取代a Func<T>,将索引传递给提供者
  • 一种非扩展方法,用于创建数组填充它

  • 我最喜欢这个解决方案.:-)可重复使用的方法.:-) (2认同)
  • 另一个有用的重载是用`)替换`,Func <T> provider)`,其中T:new()`然后如果你只是使用默认的构造函数你根本不需要传入一个委托(你也会需要用`new T()`替换`provider()`. (2认同)

Ond*_*cny 8

您的代码只创建数组,但不创建任何项目.基本上,你需要实例存储Sample 进入此阵.

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

Sample[] samples = new Sample[100];
for (int i = 0; i < samples.Length; i++) samples[i] = new Sample();
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ell 5

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

var arr = new SomeType[size];
for(int i = 0 ; i < size ; i++) arr[i] = new SomeType();
Run Code Online (Sandbox Code Playgroud)