2012-05-04 15 views
1

私は次のコードブロックを実行しています。コンパイラーは割り当てられていないローカル変数について不平を言っています。割り当てられていないローカル変数の使用 - ifステートメント

while (rsData.Read()) 
{ 
    if (rsData["TYPE"] != DBNull.Value) 
     strType = rsData["TYPE"].ToString().Trim(); 


    if (strType == "01") 
    { 
     if (rsData["Text"] != DBNull.Value) 
      strwho = rsData["Text"].ToString(); 

     if ((strwho.Length < 10 || (strwho.IndexOf("NULL") > 1))) 
      strwho = ""; 
    } 
    else if (strType == "07") 
    { 
     if (rsData["Text"] != DBNull.Value) 
      strmetades = rsData["Text"].ToString(); 

     if ((strmetades.Length < 10 || (strmetades.IndexOf("NULL") > 1))) 
      strmetades = ""; 
    } 

「if(strType == "01")」行のすべてに不満があり、何が起きているのかわかりません。私はこれにスイッチを使用することを考えましたが、それも同じ問題を抱えているようです。

アイデア?

+2

strTypeはどこで宣言していますか? – Zaki

+0

あなたは100%あなたはエラーではなく警告を受けていますか?私は正直なところ、単に変数を取り除き、単に 'rsData [" TYPE "]。ToString()の値をチェックするだけです。そうすることのパフォーマンスコストを考慮したTrim() 'は簡単です。 –

答えて

10

文字列strTypeを宣言するときに、

string strType = null; 

詳細ような値を割り当てる必要があります:あなたはそれを使用する前に、ローカル変数に何らかの値を割り当てる必要がありますCompiler Error CS0165

+0

暗黙的にnullとして定義する必要はありますか? コードの冒頭に文字列を宣言しましたが、特にnullとは言いません。 – PipBoy

+0

はい、宣言の瞬間に明示的に値を割り当てる必要があります。あるいは、変数が文で使用される前に(あなたの場合はif文)、null、string.Empty、 ""などを割り当てることができます。 – jorgehmv

+0

誤っているようです - いつでも変数を割り当てる必要はありません。割り当てられていないコードパスでは決して使用されません。最初の "if"に "else {continue;}"を入れることで、コードを簡単に(そして潜在的により正確に)修正することができます。 – Iridium

0

を。 (あなたはstrTypeは、前の反復からその値を覚えてしたくない場合)、

var strType = ""; // or null 

それとも初期値を取得することを確認し、両方の時にリーダー:あなたは(ブロックしばらく前に)それを宣言する場所でそれを初期化することができますデータが含まれている、またはDbNullに

strType = rsData["TYPE"] == DBNull.Value ? "" : rsData["TYPE"].ToString().Trim(); 
0

がある場合であればの時点で変数がどのような値を持っていないなステートメントので、それは文句を言います。

だけstring strType = "";

0

このエラーは、以前にその変数を宣言していなかったことを意味します。 whileループの始めにこれらの変数を初期化するだけです。

例:

while (rsData.Read()) 
{ 
    string strType = string.Empty; 
    string strwho = string.Empty; // Do this if you have the same error for strwho 
    string strmetades = string.Empty; // Do this if you have the same error for strmetades 

    // Your other code comes here 
} 

あなたは少し異なるIF文あなたを注文した場合、あなたも変数に空の値の再割り当てを回避することができます。

2

この理由は、あなたがそれを使用前に、任意の値するstrType変数を割り当てるされていないということです。 C#コンパイラの規則によれば、の変数をに割り当てなければなりません。の値を使用する前に値を割り当ててください。言い換えれば

、何は十分なはずは例えばたわごとのように、consditions前に空の文字列を代入です:

strType = srting.Empty; //at least one value is already assigned! 

while (rsData.Read()) 
{ 
    .... //your code here 
} 

なぜ、この?あいまいさを避け、明確なコード提示ではない。

このの詳細を、dierctlyエリックリペットから小さな記事読み:Why are local variables definitely assigned in unreachable statements?

+0

あなたが提供したコードの潜在的な副作用は、データセットにnull以外のものが散在しているNULL TYPEの行が含まれている場合、以前のNULLでない行のTYPEの値は(これまでに処理されたNULL以外のTYPEを持つ行が少なくとも1つあれば)NULL TYPEの行が検出されます。 – Iridium

+0

@イリジウム:私はあなたのことを理解していますが、コードフローを掘り下げずにコンセプトを表現しました。正しい**デフォルトの**値は、OP自体によって選択されなければなりません。ループの終了時にループが完了していないので注意してください... – Tigran

0

を使用し、String.Emptyをいいことを。

string strType=String.Empty; 
+0

これは彼のエラーの理由を説明していないので、答えは役に立たない、文字列のデフォルト値はすでに空文字列です。 –

関連する問題