从类实例定义默认数组值

时间:2011-10-27 16:20:19

标签: c#

我有以下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数组的大小后,元素立即为空......

任何建议表示赞赏。

感谢。

4 个答案:

答案 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。但列表解决方案更适合性能。