2016-04-06 11 views
1

コードの理解に問題があります。 私はUnityでのコーディングを学んでいますが、C#についての知識はほとんどありませんでしたが、何かが私の注意を引いた - もちろん変数intを宣言してから(値を設定せずに)if文で使用します。C# - 初期化の前に変数を使用する

私はhereを読みましたが、C#で初期化されていない変数を使用することはできません。そして別のプロジェクトで自分で調べました。私はそれが構造(クラスではない)のためだと思っていましたが、なぜ変数に影響を与えるのか分かりませんでした...

外に(ペーストビン)たくさんありますのでserver - この変数を持つコードはコメントとして設定されます(見やすくするため)。

ここでは、これらの断片だけを置くことにします(時間を無駄にしたくない人にとって)。

  1. private int questionsFinished;

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

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

それが働いて、なぜ私は理解していない - 変数に値がない、はい? あらかじめありがとうございます。

+0

int型のメンバー変数は、別の値に明示的に初期化されていないと自動的に0に初期化されます。 – user469104

+0

私の質問には何が問題なのですか? – Szkaplerny

答えて

2

質問あなたのクラスのフィールドであるため、仕上がりに値があります。フィールドは、明示的に設定しない限り、デフォルト値に初期化されます。この場合、questionsFinishedはintであるため0に初期化されます。数値型の既定値は0、boolはfalse、文字列と参照型の既定値はnullです。構造体はコンストラクタに応じてデフォルト値になります。

変数は、メソッド内のローカル変数を意味します。ここではエリックリペットから

グレート説明:

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

基本的に - あなたはバグである可能性が最も高いのローカル変数を初期化していないと、コンパイラがあなたを助けている場合。デフォルト値を持つフィールドは一般的なケースですので、コンパイラはあなたが意図的に行ったことを前提としており、バグは発生しません。

+0

これは@ user469104コメントの後でより正確な答えです。値の型intにのみ追加できます。デフォルト値は0です。参照型の場合はnullです。 – Vladimir

+0

Thanks @Vladimir - updated – JimBobBennett

1

questionsFinishedフィールド、いないローカル変数であるので、初期化する必要ません。しかし、これを行うのが良い習慣です。

一般に、コンパイラは、フィールドが使用前に値に設定されるかどうかを確定的に伝えることはできません(パブリックフィールドは外部から初期化できるため)、エラーは発生しません。

フィールドは、デフォルト値(intの場合は0)に初期化されます。

関連する問題