C# 数组声明为类字段vs局部变量

C# 数组声明为类字段vs局部变量,c#,unity3d,C#,Unity3d,我知道这是一个基本问题,但似乎没有明确的答案。 将数组声明为类字段时,不允许在运行时确定变量大小 public class MyClass : MonoBehaviour{ int size = 6; float[] f = new float[size]; //not allowed // Start is called before the first frame update void Start() { //some code

我知道这是一个基本问题,但似乎没有明确的答案。 将数组声明为类字段时,不允许在运行时确定变量大小

public class MyClass : MonoBehaviour{

    int size = 6;
    float[] f = new float[size]; //not allowed

    // Start is called before the first frame update
    void Start()
    {
      //some code
    }
}
以相同的方式声明,但作为函数内部的局部变量,例如Start,则完全可以:

public class MyClass : MonoBehaviour{

    void Start()
    {
        int size = 6;
        float[] f = new float[size];

        //some code
    }
}
这与变量的范围有关吗?或者内存分配发生在堆栈、堆等位置? 提前感谢您

根据 与System.Collections命名空间中的类不同,数组具有固定的容量。要增加容量,必须创建具有所需容量的新数组对象,将元素从旧数组对象复制到新数组对象,然后删除旧数组

编译错误。“实例字段不能用于初始化方法之外的其他实例字段”+实例字段初始化解释此问题

出于同样的原因,您不能这样做:

    int int1 = 3;
    int int2 = int1;
按照 与System.Collections命名空间中的类不同,数组具有固定的容量。要增加容量,必须创建具有所需容量的新数组对象,将元素从旧数组对象复制到新数组对象,然后删除旧数组

编译错误。“实例字段不能用于初始化方法之外的其他实例字段”+实例字段初始化解释此问题

出于同样的原因,您不能这样做:

    int int1 = 3;
    int int2 = int1;

对此有明确的答案,您可以在以下内容中找到:

实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用
this
是编译时错误,因为变量初始值设定项通过简单的_名称引用任何实例成员是编译时错误。在示例中:

A类
{
int x=1;
int y=x+1;//错误,引用此
}
y的变量初始值设定项会导致编译时错误,因为它引用了正在创建的实例的成员


对此有明确的答案,您可以在以下内容中找到:

实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用
this
是编译时错误,因为变量初始值设定项通过简单的_名称引用任何实例成员是编译时错误。在示例中:

A类
{
int x=1;
int y=x+1;//错误,引用此
}
y的变量初始值设定项会导致编译时错误,因为它引用了正在创建的实例的成员


我相信当您声明为成员变量时,会出现编译时错误,说明
字段初始值设定项不能引用非静态字段、方法或属性。错误本身说明了编译错误的原因。现在,如果要声明为字段,则将大小定义为
const
,这样大小值仅在编译时可用。。。Chnage
int size=6
const int size=6
当然,如果在构造函数中初始化数组字段,而不是尝试在字段声明本身内联初始化它,则可以改变数组字段的大小。您需要区分声明和初始化。谢谢您的回答。我知道解决方法(使用列表而不是数组,将其声明为常量等)。我所寻找的是一个关于推理的洞察,为什么C#会在“Start”函数中允许它。另外,另一篇文章说,,在构造函数中初始化内联和初始化似乎对允许的和非类的字段在
静态
上下文中初始化没有影响,因为它发生在调用构造函数之前,所以
这个
还不存在,因此您不能引用任何内容这是基于实例的。。只有其他
static
内容我相信当您声明为成员变量时,会引发编译时错误,说明
字段初始值设定项无法引用非静态字段、方法或属性。错误本身说明了编译错误的原因。现在,如果要声明为字段,则将大小定义为
const
,这样大小值仅在编译时可用。。。Chnage
int size=6
const int size=6
当然,如果在构造函数中初始化数组字段,而不是尝试在字段声明本身内联初始化它,则可以改变数组字段的大小。您需要区分声明和初始化。谢谢您的回答。我知道解决方法(使用列表而不是数组,将其声明为常量等)。我所寻找的是一个关于推理的洞察,为什么C#会在“Start”函数中允许它。另外,另一篇文章说,,在构造函数中初始化内联和初始化似乎对允许的和非类的字段在
静态
上下文中初始化没有影响,因为它发生在调用构造函数之前,所以
这个
还不存在,因此您不能引用任何内容这是基于实例的。。只有其他
static
stuff“这就是为什么不能使用变量设置数组大小,会引发编译错误。”但是第二个代码片段使用变量设置数组大小(并且工作完全正常),感谢您的回答。我知道数组被设计为默认的静态DS,不允许变量作为数组的大小是有意义的——这是List类的目的——但是为什么在“Start”函数中允许它呢?我的问题是更好地理解C#和Unity的记忆模型,而不是简单地找到一个解决方案来让它工作