2016-04-26 5 views
0

外対使用してブロック内のリソースを作成し、使い捨て資源の新たなインスタンスにより作成することができます。たとえば、使用してブロック

があれば、次のスタイルで、違いは何ですか
var resource = CreateNewResource(); 

コーディング?

最初のスタイル:

var resource = CreateNewResource(); 
using (resource) 
{ 
    //Use resource 
} 

セカンドスタイル:

using (var resource = CreateNewResource()) 
{ 
    //Use resource 
} 

は、私たちが使用してブロック以外の場所のリソースを使用しない場合は最初のスタイル悪いコーディングの練習ですか?私たちが使用してブロックの外側使い捨てのリソースを使用して、この願いが奨励されるべきで、使用してブロックの外側のリソースを使用するようにを希望場合でも

+0

違いは、クラスのインスタンスの廃棄時間です。ブロックを使用する場合、クラスのインスタンスはブロックから出た後に破棄されます。 –

+0

@SiyavashHamdi:私はそれほど多くはないと思った。最初のコーディングスタイルはどうなりますか?最初のスタイルでコーディングするのは面白いのですか?私は多くの場所でそのスタイルを見てきました。 – displayName

+0

@SiyavashHamdi:さらに、最初のスタイルのリソースはどうなりますか? – displayName

答えて

5

最初の注目すべき違いは、最初のスニペットで変数リソースがusingブロックの後でも宣言されているため、誰かが破棄された後にその変数を使用できるということです。

var resource = CreateNewResource(); 
using (resource) 
{ 
    //Use resource 
} 
... 
// Unknowingly continues to use resource 
resource.BadActOnDisposedObject(); 

あなたは明らかに使用し、より自由に、あなたのリソースを割り当てたい場合は、私はそうのように、/ついに試して使用することをお勧めします:

Resource resource = null; 
try 
{ 
    // do whatever 
    resource = CreateNewResource(); 
    // continue to do whatever 
} 
finally 
{ 
    if (resource != null) 
    { 
     resource.Dispose(); 
     resource = null; 
    } 
} 

これはあなたのリソースはいずれのケース内に配置されていることを保証します。

+0

Ok。見た最初のスタイルは明らかです – displayName

+0

@displayName公的なコードや職場では、どこで使われているのですか? –

+0

@DStanley:私はトラップされています。推測:D – displayName

0

オク..それは明らかに悪い習慣です。

かなりよくdocumented on MSDN

あなたは、リソースオブジェクトをインスタンス化してから使用して文を する変数を渡すが、これはベストプラクティスではありませんすることができます。この場合、 オブジェクトは、制御が使用ブロックを去った後でも有効範囲内に留まります。 でも、管理されていない リソースへのアクセスはおそらくありません。つまり、完全に初期化されなくなります。 オブジェクトを使用ブロック外で使用しようとすると、 例外がスローされる危険性があります。このため、一般に、 はusingステートメントでオブジェクトをインスタンス化し、そのスコープを usingブロックに制限する方が適切です。

オンラインでこのスタイルを見ました。私自身のコードでは、スタイル2のリソース宣言文が非常に長いたびに、宣言をusing(){}から取り除き、コードをより読みやすくするためにスタイル1で述べたようにコードを書きました。

+0

可読性が問題となる場合は、 'using()'宣言内に改行を入れ、内側の部分を別の行に置くことができます。 –

+0

@DStanley:コールは 'var resource = CreateNewResourceByCallingALargeNamedMethod(abc、def、ghi、jklmnopqrstu、vwxyz);のようなものです。 Visual Studioはテキストをコンマで区切ります。読めるように書く方法はありません。複数の行に分割することができ、それぞれの入力に独自の行が与えられますが、これは不必要に使用ブロックを長くします。 – displayName

関連する問題