C#-初始化前使用变量

C#-初始化前使用变量,c#,C#,我在理解代码方面有问题。 我正在学习Unity中的编码,我对C#有一点了解,但有一点引起了我的注意——在课程中,我们首先声明变量int(不设置任何值),然后在if语句中使用它 我读到不允许在C#中使用未初始化的变量。我自己在另一个项目中检查了它。我认为这是因为结构(不是类),但我不知道为什么它会对变量产生影响 因为有很多不必要的代码,我将把它放在外部(pastebin)——带有此变量的代码设置为注释(为了更好的可见性) 在这里,我将只放这些片段(对于那些不想浪费时间去经历整个混乱的人) priv

我在理解代码方面有问题。 我正在学习Unity中的编码,我对C#有一点了解,但有一点引起了我的注意——在课程中,我们首先声明变量int(不设置任何值),然后在if语句中使用它

我读到不允许在C#中使用未初始化的变量。我自己在另一个项目中检查了它。我认为这是因为结构(不是类),但我不知道为什么它会对变量产生影响

因为有很多不必要的代码,我将把它放在外部(pastebin)——带有此变量的代码设置为注释(为了更好的可见性)

在这里,我将只放这些片段(对于那些不想浪费时间去经历整个混乱的人)

  • private int问题完成

  • […]
    如果(问题完成<问题编号选择长度-1)
    {
    moveToNextQuestion();
    问题完成++;
    }

  • public void moveToNextQuestion()
    {
    分配问题(questionNumbersChoosen[questionNumbersChoosen.Length-1-问题完成];
    }

  • 我只是不明白它为什么工作——变量没有值,是吗?
    提前感谢各位。

    问题完成
    是一个字段,不是局部变量,因此不需要初始化。然而,这样做是一种良好的做法

    一般来说,编译器无法确定在使用前是否将字段设置为值(因为公共字段可以在外部初始化),因此不会生成错误


    字段初始化为默认值,对于
    int

    问题,默认值为0。Finished确实有一个值,因为它是类中的一个字段。除非明确设置字段,否则字段将初始化为其默认值。在这种情况下,questionsFinished将被初始化为0,因为它是一个int。数字类型默认为0,bools默认为false,字符串和引用类型默认为null,结构默认值取决于它们的构造函数

    变量是指方法中的局部变量

    Eric Lippert的精彩解释如下:


    本质上-如果你不初始化一个局部变量,它很可能是一个bug,编译器会帮你解决。具有默认值的字段是一种常见的情况,因此编译器假定您是故意这样做的,并且不会引起错误。

    int类型的成员变量如果没有显式初始化为另一个值,则会自动初始化为0。我的问题有什么问题,所以它被否决了?这是@user469104之后更准确的答案评论。只能添加值类型int的默认值为0,如果它是引用类型,则nullThank@Vladimir-updated