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>,将索引传递给提供者您的代码只创建数组,但不创建任何项目.基本上,你需要实例存储的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)
另请注意,您的解决方案不是线程安全的.
没有办法自动执行此操作;数组初始化本质上就是“将这块内存擦除为0”。你必须做类似的事情:
var arr = new SomeType[size];
for(int i = 0 ; i < size ; i++) arr[i] = new SomeType();
Run Code Online (Sandbox Code Playgroud)