0

私はこのように見えるいくつかのコードを持っています:

Object o;
using (SqlConnection sql = GetSqlConnection) {
    using (SqlCommand sqlCommand = GetSqlCommand()) {
        using (Datareader dr = GetDataReader()) {
            o = new Object();
            while (dr.read()) {
                //do something
            }
        }
        if (o == null) // RESHARPER SAYS THAT THIS WILL ALWAYS BE TRUE
            //do something
    }
}

私がチェックする場所o == null、ReSharperは、このコマンドは常に真であると言っています。私はこの振る舞いを理解していません。usingブロックで初期化されたすべてのオブジェクトを破棄するか、usingステートメントで作成されたオブジェクトのみを破棄します。

4

3 に答える 3

2

usingブロックが閉じられると、そのオブジェクトに対してDispose()が呼び出され、IDisposableの実装によっては、オブジェクトがnullに設定される場合があります。ただし、あなたの場合の「o」はIDisposableまたはusingブロックではありません。この場合、ReSharperにバグがあると信じています。これは、インストールにまったく同じコードがあると、置き換えるように求められるためです。

if(o == null)

falseで、あなたの問題の正反対です。

于 2013-03-25T23:43:51.223 に答える
1

「using」ブロックでオブジェクトを初期化すると、オブジェクトはブロックの外側に配置されますか?

いいえこれが証拠です。

もちろん、使用しているオブジェクトは破棄されますが(これが使用の要点です)、ブロック内で行われたことは影響を受けません。ただし、これは新しいスコープであるため、次のコードで警告が表示されます

Object o;
using (SqlConnection sql = GetSqlConnection) {
    using (SqlCommand sqlCommand = GetSqlCommand()) {
        using (Datareader dr = GetDataReader()) {
            Object o = new Object();
            while (dr.read()) {
                //do something
            }
        }
        if (o == null) // RESHARPER SAYS THAT THIS WILL ALWAYS BE TRUE
            //do something
    }
}

(内部スコープの2番目のオブジェクトoの宣言に注意してください)。

于 2013-03-25T23:42:04.650 に答える
1

あなたのコードが正確に書かれている通りであり、Resharperがあなたが示した行について本当に不平を言っているなら、それは間違っています。

実際、ReSharperはそれを正確に逆にしています。比較は決して真ではないため、冗長です。すぐに設定oするので、決してなりません。このブロックは、冒頭陳述に入力した変数以外の変数の値には影響しません。ブロックを離れると、その1つのインスタンスはそれを呼び出すことによって破棄され、スコープ外になります。new Object()nullusingusingIDisposable.Dispose

ただし、私はあなたが持っていると思われる1つの大きな誤解を修正したいと思います。オブジェクトを破棄してもnullに設定されません。次のコード、既に破棄されたオブジェクトを閉じようとするとクラッシュします。

var conn = new SqlConnection(GetConnectionString());
conn.Open();
conn.Dispose();

if (conn != null)
{
  conn.Close();
}

「廃棄される」とは、オブジェクトのインスタンスに適用される条件です。これは、リソースがクリーンアップされ、安全に使用できなくなったことを意味します。「nullであること」は変数に適用される条件です; これは、それらが定義されたタイプのインスタンスを参照ていないことを意味します。

usingキーワードとインターフェースは、IDisposableオブジェクトのインスタンスのis-disposed-of状態を管理するために使用しています。これらは、プログラム内の変数のis-a-null-value状態には影響しません。

于 2013-03-25T23:47:37.410 に答える