11

using ステートメント内の using ステートメントで作成している変数を返しています (変に聞こえます)。

public DataTable foo ()
{
    using (DataTable properties = new DataTable())
    {
       // do something
       return properties;
    }
}

これはプロパティ変数を破棄しますか??

これを行った後も、この警告が表示されます:

警告 34 CA2000 : Microsoft.Reliability : メソッド 'test.test' で、オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'properties' で System.IDisposable.Dispose を呼び出してください。

何か案は?

ありがとう

4

7 に答える 7

12

返したい場合は、usingステートメントでラップすることはできません。中かっこを離れると、スコープから外れて破棄されるためです。

次のようにインスタンス化する必要があります。

public DataTable Foo() 
{ 
    DataTable properties = new DataTable();
    return properties; 
} 

Dispose()そして後でそれを呼び出します。

于 2010-05-12T20:55:02.520 に答える
10

はい、破棄してから返却します。これはほとんどの場合、悪いことです。

実際、DataTableDisposeほとんど何もしませんが (IIRC がどこかにリモートにある場合を除きます)、それでも一般的には悪い考えです。通常、破棄されたオブジェクトは使用できないと見なす必要があります。

于 2010-05-12T20:56:58.933 に答える
7

おそらく、これは使い捨てオブジェクトを作成するファクトリメソッドのパターンです。しかし、私はまだコード分析がこれについて不平を言うのを見ました:

        Wrapper tempWrapper = null;
        Wrapper wrapper = null;

        try
        {
            tempWrapper = new Wrapper(callback);
            Initialize(tempWrapper);

            wrapper = tempWrapper;
            tempWrapper = null;
        }
        finally
        {
            if (tempWrapper != null)
                tempWrapper.Dispose();
        }

        return wrapper;

これにより、初期化が失敗した場合にオブジェクトが適切に破棄されることが保証されますが、すべてが成功した場合は、破棄されていないインスタンスがメソッドから返されます。

MSDNの記事:CA2000:スコープを失う前にオブジェクトを破棄します

于 2010-05-12T21:02:05.467 に答える
3

はい。usingコードブロックの最後に配置したくないものにキーワードを使用しているのはなぜですか?

usingキーワードの目的は、オブジェクトを破棄することです。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2010-05-12T20:56:38.270 に答える
2

using ブロックのポイントは、値/オブジェクトの人工的なスコープを作成することです。using ブロックが完了すると、オブジェクトは不要になるためクリーンアップされます。作成しているオブジェクトを本当に返したい場合は、使用する場合ではありません。

これで問題なく動作します。

public DataTable foo ()
{
    DataTable properties = new DataTable();
    // do something
    return properties;
}
于 2010-05-12T20:59:28.703 に答える
1

usingキーワードを使用するコードは、次のように展開されます。

{
    DataTable properties = new DataTable();
    try
    {
        //do something
        return properties;
    }
    finally
    {
        if(properties != null)
        {
            ((IDisposable)properties).Dispose();
        }
    }
}

あなたの変数は、使用方法の性質によって破棄されています。プロパティを返すことができるようにしたい場合は、usingブロックでラップしないでください。

于 2010-05-12T20:59:44.620 に答える
0

他の応答は正しいです。using ブロックを終了するとすぐに、オブジェクトは破棄されます。using ブロックは、オブジェクトがタイムリーに破棄されることを確認するのに最適です。そのため、関数のコンシューマーが後でオブジェクトを破棄することを覚えていることに頼りたくない場合は、次のようなことを試すことができます。

public void UsingDataContext (Action<DataContext> action)
{
    using (DataContext ctx = new DataContext())
    {
       action(ctx)
    }
}

このようにして、次のように言えます。

var user = GetNewUserInfo();
UsingDataContext(c => c.UserSet.Add(user));
于 2010-05-12T21:35:41.507 に答える