2010-11-19 14 views
4

私は、そのオブジェクトを関数returnの一部として使用して返します。これは、オブジェクトのような問題は、返された値を別のもの関数 ?それはどうかreturnまたはいくつかの他のコードパスで、スコープの外に出るときUSINGによって作成されたオブジェクトを返します

using (MyObject obj = new MyObject()) 
{ 
    . 
    . 
    . 
    return obj; 
} 
+0

http://msdn.microsoft.com/en-us/library/ms182289.aspx私はこのようなコードのCA2000警告を修正しようとしています。 – aziz

答えて

16

戻り値を別の関数で使用しようとすると、オブジェクトのような問題が発生しますか?

はい。

あなたはここで何をしようとしているのか説明できますか?このコードは意味をなさない。 ポイントが "使用中"の場合、を使用しています。オブジェクトここではとなり、その不十分な管理されていないリソースが自動的に取り除かれ、使用できなくなります。あなたがしたいことをするためのより良い方法がおそらくあります。

+1

+1他の答えは正しいのですが、私はそのことをユーザーに説明することが重要であると考えています。 –

+0

正しい質問をするための+1 –

+0

私が達成しようとしていることについて質問するコメントを追加しました。ありがとう – aziz

5

オブジェクトはDispose() -dとなります。 usingの唯一の目的は、IDisposableオブジェクト(ローカルスコープ)のフェールセーフメカニズムを提供して、囲まれたコードブロックで何が起きてもクリーンアップされるようにすることです。

これは、あなたの呼び出し関数に問題をもたらす可能性があるので、これをしないでください。

2

あなたのオブジェクトは、あなたがそれを返却した直後に処分されます。それはまだガベージコレクションされていないので技術的に使用可能ですが、Dispose機能が実行されます。

この場合、私が従う規則は、オブジェクトを受け取るメソッドがそれを破棄することによって課されるということです。そのメソッドがいつ終了するのかわからないので、それが完了したときにそれ自身を整理するのはそのメソッドの責任です。

+0

「ガベージコレクションされていない*」と言ってはいけませんか? –

+0

ありがとう、ミスタイプ。 – kemiller2002

1

私の個人的意見ではありませんが、最も正しいとは限りませんが、作業単位がスコープ内で定義されていて、使用する構成のオブジェクトを廃棄したい場合は、使用する構成を使用する必要があります。

+0

は意見であってはいけません。それは事実です。 +1 –

0

これは問題を引き起こします。あなたがこのオブジェクトの処理のために応答できないが、呼び出し元があるので、この場合(私はデータベースアクセサークラスを返すメソッドを考えることができる)usingブロックを使用しないでください。

0

Disposeメソッドがないオブジェクトではおそらく機能しますが、 'using'を使用する必要はありません。

あなたの特定のオブジェクトでうまく動作しても、間違っています。これは、「使用する」構成が何であるかではありません。

0

技術的には、実装されたIDisposableインターフェイスのDisposeメソッドでは、MyObjectが実行することが条件になります。

これは理論的には、不要なtry/catch/finallyブロックで物をラップするだけで完璧に機能します。

public void DoStuff() 
{ 
    MyObject myObject = GetMyObject(); 
    Console.WriteLine("Name: " + myObject.Name); 
} 

private MyObject GetMyObject() 
{ 
    using (MyObject obj = new MyObject()) 
    { 
     obj.Name = "Aaron"; 
     return obj; 
    } 
} 

public class MyObject : IDisposable 
{ 
    public String Name { get; set; } 

    #region IDisposable Members 

    public void Dispose() 
    { 
     //depends what you do in here... 
    } 

    #endregion 
} 

名:アーロン

0

あなたは、本質的にそれが何を使用してスコープ線量だと、オブジェクトが配置されていると言って、あなたのオブジェクトの消費者には例外になるだろう - IDisposableを実装を呼び出します。

0

使い捨てオブジェクトを返す必要がある場合は、すべてのコードパスがオブジェクトを返すか、破棄する必要があります。関数ISからスローされた例外は、有効なコードパスであることに注意してください。このケースをカバーするには、try-catchまたはtry-finallyで作成と戻りの間にコードセグメントをラップして、returnステートメントに正常に到達しなかった場合にオブジェクトが適切に処理されるようにします。

関連する問題