public class Sample
{
static int count = 0;
public int abc;
public Sample()
{
abc = ++Sample.count;
}
}
我想创建一个上面的类数组,并希望通过调用默认构造函数来初始化数组中的每个元素,这样每个元素可以有不同的abc
。所以我这样做了:
Sample[] samples = new Sample[100];
但这不符合我认为它应该做的事情。这似乎是默认构造函数没有被调用。如何在创建数组时调用默认构造函数?
我也想知道上述陈述是做什么的?
答案 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 suggestion到Jon'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();