Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类实例定义默认数组值_C# - Fatal编程技术网

C# 从类实例定义默认数组值

C# 从类实例定义默认数组值,c#,C#,我有下面的c类 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课 public class bigc

我有下面的c类

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课

public class bigclass  
{
    public smallclass[] smallclasses;
}
然后在我的程序的其他地方,我用

smallclasses = new smallclass[3];
但我意识到这三个元素是空的。。。 这是正确的行为吗

请允许我澄清一下,每当我调整smallclasses数组的大小时,它的元素都会自动“构造”。。。我只是不知道这样的事能不能做

与我预期的不同,设置默认值没有效果。调整smallclasses数组大小后,元素立即为空

谢谢你的建议


谢谢。

如果我正确理解了你的问题,请查看方法。创建新大小的数组时,它将帮助您保留原始数组中对象的值。从链接文章中:

此方法分配一个具有指定大小的新数组,即副本 元素,然后替换旧数组 使用新的数组

根据评论更新:


如果希望数组中的引用引用有效对象,则必须分配这些对象并将其存储在数组中。对于C数组,您只需要对数组对象进行引用。如果希望数组包含实际的对象,您仍然必须分配对象本身并将它们的引用存储到数组中。

如果我正确理解您的问题,请检查该方法。创建新大小的数组时,它将帮助您保留原始数组中对象的值。从链接文章中:

此方法分配一个具有指定大小的新数组,即副本 元素,然后替换旧数组 使用新的数组

根据评论更新:


如果希望数组中的引用引用有效对象,则必须分配这些对象并将其存储在数组中。对于C数组,您只需要对数组对象进行引用。如果希望数组包含实际的对象,您仍然必须分配对象本身并将其引用存储到数组中。

您要求自动为您创建对象数组。这不是语言的工作方式。您需要单独构造每个对象,或在循环中构造每个对象


如果在声明数组时未初始化该数组,则会将成员初始化为该数组类型的默认初始值。对于引用类型,该值为空。

您要求自动为您创建对象数组。这不是语言的工作方式。您需要单独构造每个对象,或在循环中构造每个对象

如果在声明数组时未初始化该数组,则会将成员初始化为该数组类型的默认初始值。对于引用类型,该值为null。

尝试使用而不是smallclass[]。你也可以在数组上调整数组大小。但是列表解决方案的性能更好。

尝试使用而不是smallclass[]。你也可以在数组上调整数组大小。但是列表解决方案的性能更好。

smallclasses=newsmallclass[3];正在调整数组的大小。它正在创建一个新阵列

您的数组声明公共smallclass[]smallclass;在类bigclass中创建初始值为null的字段。语句smallclasses=newsmallclass[3];创建一个新的数组对象,并将该对象的引用指定给字段smallclasses

无论何时创建引用类型(即类)的新数组,该数组的所有元素都为null。这是预期的行为。参见C规范第1.8节,其中部分说明:新运算符自动将数组元素初始化为其默认值,例如,对于所有数值类型,默认值为零,对于所有引用类型,默认值为null。

smallclass=new smallclass[3];正在调整数组的大小。它正在创建一个新阵列

您的数组声明公共smallclass[]smallclass;在类bigclass中创建初始值为null的字段。语句smallclasses=newsmallclass[3];创建一个新的数组对象,并将该对象的引用指定给字段smallclasses


无论何时创建引用类型(即类)的新数组,该数组的所有元素都为null。这是预期的行为。请参阅C规范的第1.8节,其中部分内容是:新运算符自动将数组元素初始化为其默认值,例如,对于所有数字类型,默认值为零,对于所有引用类型,默认值为null。

如果我不清楚,我很抱歉,但我从未实际初始化这些值。我只是声明SmallClass,然后为数组分配一个非零大小。我的问题是,在这种情况下,这些值是空的,我希望并且需要它们是“smallclass”默认值。如果这是您想要的,您必须显式地将它们初始化为新构造的实例

e不是“自动构造器”吗?那么对不起,什么是默认值?@roamcel所谓的默认值实际上是字段初始值设定项。当用new关键字构造对象时,这些值就会运行。如果我不清楚,我很抱歉,但我从来没有实际初始化这些值。我只是声明SmallClass,然后为数组分配一个非零大小。我的问题是,在这种情况下,这些值是空的,我希望并且需要它们是“smallclass”默认值。如果这是您想要的,您必须显式地将它们初始化为新构造的实例。所以没有“autoconstructor”这样的东西?那么对不起,什么是默认值?@roamcel所谓的默认值实际上是字段初始值设定项。当使用new关键字构造对象时,这些将运行。也许您的用例会调用valuetypes:它们总是自动初始化为默认值。它们还具有值语义——这对于小型应用程序来说通常是可以的types@sehe结构是否使用预定义值实例化?例如,如果我将“smallclass”替换为相应的结构,当我调整数组大小时,是否会自动填充我的“bigclass.smallclasses”数组,而不是给我空值?很抱歉问了这么多无知的问题。@roamcel结构使用默认值初始化,但不使用用户定义的默认值,这是不允许在结构中提供的。相反,它们初始化时所有字段都设置为零,布尔字段为false,引用类型字段为null。感谢大家的帮助。结构是值类型,不能为null。这就是区别。也许您的用例会调用valuetypes:它们总是自动初始化为默认值。它们还具有值语义——这对于小型应用程序来说通常是可以的types@sehe结构是否使用预定义值实例化?例如,如果我将“smallclass”替换为相应的结构,当我调整数组大小时,是否会自动填充我的“bigclass.smallclasses”数组,而不是给我空值?很抱歉问了这么多无知的问题。@roamcel结构使用默认值初始化,但不使用用户定义的默认值,这是不允许在结构中提供的。相反,它们初始化时所有字段都设置为零,布尔字段为false,引用类型字段为null。感谢大家的帮助。结构是值类型,不能为null。这就是区别。这看起来像是我想知道的:那么值为null的事实实际上是正确的,预期的行为?或者我的声明或类方法中缺少某些内容?您可以使用数组初始值设定项语法用非null实例初始化数组。这似乎是我想知道的:那么值为null的事实实际上是正确的、预期的行为?或者我的声明或类方法中缺少某些内容?您可以使用数组初始值设定项语法使用非空实例初始化数组。感谢您的详细说明。现在一切都讲得通了。谢谢你的彻底澄清。这一切现在都有意义了。事实证明,这是一个关于可能的重构的好建议。谢谢。事实证明,这是一个关于可能的重构的好建议。谢谢