2

これはおそらく非常に単純なオブジェクト指向プログラミングの質問です。私がやろうとしているのは、2つの空のオブジェクトを取得し、クエリを使用してデータベースからデータをプルし、空のオブジェクトにクエリから返されたデータを入力して、それらに対してアサートすることです。以下のコードを参照してください。

        object test1;
        object test2;

        using (SqlConnection dbconnection = new SqlConnection(expconnstr))
        {
            dbconnection.Open();

            var expcommand = new SqlCommand(expectedquery, dbconnection);
            var actcommand = new SqlCommand(actualquery, dbconnection);

            using (SqlDataReader expreader = expcommand.ExecuteReader())
            {
                if (expreader.Read())
                {                        
                    test1 = expreader.GetValue(0);
                    expreader.Close();
                }
            }

            using (SqlDataReader actreader = actcommand.ExecuteReader())
            {
                if (actreader.Read())
                {
                    test2 = actreader.GetValue(0);
                    actreader.Close();
                }
            }
        }
        Assert.AreSame(test1, test2);

私は同じパターンに従ってVBで非常によく似たテスト方法を作成し、VBコードは問題なく実行されました。ただし、VBからC#に移行しているときに、このような問題が発生します。コンパイラは、アサートで「割り当てられていない変数の使用」と言います。ただし、上記のコードブロック内の値に割り当てていると思いました。私は何が間違っているのですか?

4

2 に答える 2

2

actreader.Read()falseを返す可能性があるtest2ため、割り当てられない可能性があり、コンパイラエラーが発生します。

test1test2を最初にnull:に明示的に設定することで、問題を解決できます。

object test1 = null;
object test2 = null;
于 2012-06-25T23:24:22.273 に答える
1

ifブロック内の変数に値を割り当てています。ローカル変数はデフォルト値で初期化されないため、Assertステートメントに到達するまでに変数に値が割り当てられているという保証はありません。

次の1つ以上のことが起こっています。

  • expreader.Read()戻ってきましたfalse
  • actreader.Read()戻ってきましたfalse
于 2012-06-25T23:25:27.903 に答える