2017-03-10 4 views
0

Close()Dispose()と同じです。 Closeが呼び出されてもusing文を呼び出す必要がありますか?Close()と同じです。ステートメント

私はオブジェクトを破棄する前に知っているので、closeを呼び出す必要があります。そのため、リソースをクローズし、Disposeに利用可能かもしれません。

https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx

CloseDisposeと同じであると言います。

この場合それはほぼ同等になる中、その後
FileStream fs = null; 

try 
{ 
    fs = File.OpenRead("MyFile.txt"); 
} 
finally 
{ 
    if (fs != null) 
    { 
     fs.Close(); 
    } 
} 

(理由:それは例外から保護しますtry ... finally ... ...

が含まれているため

+0

一般的には、[Using-statement](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)でiDisposableを実装しているすべてのオブジェクトを削除する必要があります閉鎖されている)。 – Esko

+0

'using'と' Dispose'は 'IDisposable'インタフェースで定義されています。 'Close'はこの定義の一部ではないので、同じように動作することは保証されません。だから、答えは:いいえ、 'Close()'は一般的に 'Dispose()'と同じではない – Stefan

+0

'Dispose'の前に' Close'を呼び出さなければならない単一の.Netライブラリクラスは考えられません。どんな実装クラスであってはならない。 – juharr

答えて

0

Close()IDisposableインタフェースとは関係、参照を持っていない:https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx

usingのみ参照、IDisposable継承されたオブジェクトに適用される:https://msdn.microsoft.com/en-us/library/yh598w02.aspx

Close()Dispose()が何らかの方法で関連していると考えられないかもしれません。

IDisposableインターフェイスが正しく実装されている場合、必要なすべてのクリーンアップが実行されるとみなされます。これは、Close()メソッドへの内部呼び出しが実行されることを意味します。つまり、Close()への明示的な呼び出しは必要ないはずです。

他の方法では、オブジェクトがタイプIDisposableであり、Close()メソッドを公開している場合は、Close()を呼び出すだけではオブジェクトを適切に廃棄/クリーンアップできません。 Dispose()を依然として呼び出す必要があります。これを直接行うことも、usingステートメントで行うこともできます。

あなたはまた(そのが正しく実装されている場合、以下を参照してくださいProper use of the IDisposable interface)ガベージコレクタがあなたのためにDispose()コールを処理させることができますしかし、あなたは適切な実装に依存しているとは直接制御することはできませんする必要があるため、これは、悪い習慣と考えられていますGCのタイミングを超えて

Close()機能を実装する理由は、通常、開発者にオブジェクトを再利用する方法を与えることです。 Dispose()を呼び出した後、オブジェクトはファイナライズのためにマークされたものとみなされ、これ以上使用することはできません。

0

usingパターンは、あなたが行う場合に便利ですStream.Close()Dispose(true)と呼ばれます)

しかし、まだ「間違っています」...にはusingを使用していますあなたが非常に正当な理由がない限り、クラスを行うことはできません(いくつかの理由があります...時には、オブジェクトの寿命を追跡することが非常に困難です。その場合、通常はDispose()にはなりません。)

パターンのコンセプトは、それがあなたの一部になっているということです。パターンからスカートを外してみると、その前または後であなたはそれを忘れるでしょう...そして何のために? MOREエラーが発生しやすいMORE行を書くには?

0

必ずしもそうではありません。私は、関連していないCloseDisposeメソッドを持つクラスを書くことができます。

class Foo : IDisposeable 
{ 
    public void Close() { doBar(); } 
    public void Dispose() { doBaz(); } 
} 
関連する問題