C# - 在初始化之前使用变量

时间:2016-04-06 20:58:01

标签: c#

我理解代码的问题。 我在Unity中学习编码,我对C#知之甚少,但有些东西引起了我的注意 - 当然我们首先声明变量int(没有设置任何值)然后我们在if语句中使用它。

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

因为有很多不必要的代码我会把它放在外面(pastebin)server - 带有这个变量的代码被设置为注释(为了更好的可见性)。

在这里,我只会放置这些碎片(对于那些不想浪费时间来完成整个混乱的人)。

  1. private int questionsFinished;

  2. [...] if(questionsFinished < questionNumbersChoosen.Length - 1) { moveToNextQuestion(); questionsFinished++; }

  3. public void moveToNextQuestion() { assignQuestion(questionNumbersChoosen[questionNumbersChoosen.Length - 1 - questionsFinished]); }

  4. 我只是不明白它为什么工作 - 变量没有价值,是吗? 提前谢谢你们。

2 个答案:

答案 0 :(得分:2)

questionsFinished确实有一个值 - 因为它是你班上的一个字段。除非您明确设置字段,否则字段将初始化为其默认值。在这种情况下,questionsFinished将初始化为0,因为它是一个int。数值类型默认为0,bools为false,字符串和引用类型默认为null,根据构造函数构造为默认值。

通过变量,它们表示方法中的局部变量。

Eric Lippert的精彩解释:

Why do local variables require initialization, but fields do not?

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

答案 1 :(得分:1)

questionsFinished字段,而不是本地变量,因此 不需要进行初始化。不过,这是一个好习惯。

通常,编译器无法确定性地判断在使用之前是否将字段设置为值(因为公共字段可以在外部初始化),因此它不会生成错误。

字段初始化为默认值,int为0。