我知道struct是值类型,类是.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
中同时创建所有元素。
答案 0 :(得分:0)
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();