我有以下c#class
public class smallclass
{
public Vector3 var1 = new Vector3(1,2,3);
public string var2 = "defaultval";
public smallclass()
{
var1 = new Vector3(11,22,33);
var2 = "constructor";
}
}
我有另一个c#class
public class bigclass
{
public smallclass[] smallclasses;
}
然后在我的程序中的其他地方,我用
增加小班的大小smallclasses = new smallclass[3];
但我意识到这三个元素都是空的...... 这是正确的行为吗?
请允许我澄清一下,我需要这样做,每当我调整smallclasses数组的大小时,它的元素就会自动“构造”......我只是不知道是否可以这样做。
与我预期的不同,设置默认值无效。在我调整smallclasses数组的大小后,元素立即为空......
任何建议表示赞赏。
感谢。
答案 0 :(得分:2)
smallclasses = new smallclass[3];
未调整数组大小。它正在创建一个新阵列。
您的数组声明(public smallclass[] smallclasses;
)会在类bigclass
中创建一个字段,其初始值为null
。语句smallclasses = new smallclass[3];
创建一个新的数组对象,并将该对象的引用分配给字段smallclasses
。
每当您创建一个引用类型的新数组(即类)时,该数组的所有元素都为null。这是预期的行为。请参阅C#规范的第1.8节,其中部分说明:“new运算符会自动将数组的元素初始化为其默认值,例如,对于所有数字类型,该值为零,对于所有引用类型,则为null。” p>
答案 1 :(得分:1)
如果我理解您的问题,请查看Array.Resize方法。在创建新大小的数组时,它将帮助您保留原始数组中对象的值。来自链接的文章:
此方法分配具有指定大小的新数组副本 从旧数组到新数组的元素,然后替换旧数组 数组与新的。
根据评论进行更新:
如果希望数组中的引用引用有效对象,则必须分配这些对象并将它们存储在数组中。使用C#数组,您只需引用一个数组对象。如果您希望它包含实际对象,您仍然必须自己分配对象并将它们的引用存储到数组中。
答案 2 :(得分:1)
您要求自动为您创建对象数组。这不是语言的工作方式。您需要单独构建每个对象,或者循环构建。
如果在声明数组时未初始化数组,则会将成员初始化为数组类型的默认初始值。对于参考类型,这是null
。
答案 3 :(得分:0)
尝试使用List of Smallclass代替小类[]。您也可以在数组上执行Array.Resize。但列表解决方案更适合性能。