C#でのローカル変数とのトラブル
-
18-09-2019 - |
質問
私は、forループ内で割り当てる必要があり、変数のカップルを持っています。ループが終了どうやら、C#がそこで起こったものは何でも無視され、変数は元の状態に戻ります。具体的には、私は彼らがリストの最後と最後から要素である必要があります。ここでは、コードがあります:
int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
// At this point, temp1 and temp2 are treated as uninitialized
注:ネヴァーマインド悪い変数名、彼らは本当に一時的な変数です。何より複雑な物事を混乱させるます。
さて、これを解決する方法は2つ(私の知っていること)がある。一つは、変数は、ループの終了後に生きるようにする方法を考え出すされ、他はあなたがするtemp = my_list[-1]
を行うことができますPythonの、のような何かを行うことですリストの最後の要素を取得します。これらの可能性のいずれかがC#でますか?
編集の私がコンパイルしようとすると、私はエラー「未割り当てのローカル変数 『TEMP1』の使用」を取得します。このコードは、でもそれだけで呼ばれることは決してありません方法の中に座っています、実行されません。このことができます場合は、私は別のループ内で変数を使用しようとしています。
解決
だけでないのはなぜ...
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
他のヒント
toReturn.Countが0の場合、ループが実行されることはありませんし、TEMP1とTEMP2が初期化されることはありません。
これは何をするのですか?
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
TEMP1を与えることを試してみて、初期値すなわち0をTEMP2か、彼らは初期化されない可能性がありますので、何が適切です。
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
コンパイラはtemp1
とtemp2
はは間違いなくそれらの値を読み取ろうとする前に、の割り当てられていることが必要です。コンパイラは、あなたのforループの変数を割り当てます知りません。ループのために、これまでのすべての実行されている場合、それは知りません。あなたの場合、条件が今までtrue
されるかどうかも分かりません。
上記のコードはtemp1
とtemp2
が何かに割り当てられていることを確認します。
temp1
とtemp2
がループの中にを割り当てられているかどうかを確認したい場合は、これを追跡することを検討
int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
temp1Assigned = true;
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
temp2Assigned = true;
}
}
あなたはデフォルト値が必要な場合:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
あなたはデフォルト値を気にして所定の位置に、カウントの前のチェックをお持ちでない場合:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];