【问题标题】:C# - Using variable before initialization [duplicate]C# - 在初始化之前使用变量[重复]
【发布时间】:2016-04-06 20:58:01
【问题描述】:

我无法理解代码。 我正在学习 Unity 编码,我对 C# 知之甚少,但有件事引起了我的注意——当然,我们首先声明变量 int(不设置任何值),然后在 if 语句中使用它。

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

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

这里我只放这些片段(给那些不想浪费时间经历整个混乱的人)。

  1. private int questionsFinished;

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

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

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

【问题讨论】:

  • int 类型的成员变量如果没有显式初始化为另一个值,则会自动初始化为 0
  • 我的问题有什么问题所以被否决了?

标签: c#


【解决方案1】:

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

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

来自 Eric Lippert 的精彩解释:

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

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

【讨论】:

  • 这是@user469104 评论后更准确的答案。只能为值类型添加int 默认值为0,如果是引用类型则为null
  • 感谢@Vladimir - 更新
【解决方案2】:

questionsFinished 是一个字段,不是一个局部变量,所以它不需要被初始化。但是,这样做是一种很好的做法。

一般来说,编译器无法确定性地判断一个字段在使用前是否会被设置为一个值(因为公共字段可以在外部初始化),所以它不会产生错误。

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

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2021-09-13
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多