C#Usingブロックとは何ですか?なぜ使用する必要があるのですか? [複製]
-
03-07-2019 - |
質問
この質問にはすでに回答があります:
C#のUsingブロックの目的は何ですか?ローカル変数とはどう違いますか?
解決
タイプがIDisposableを実装している場合、自動的に破棄されます。
指定:
public class SomeDisposableType : IDisposable
{
...implmentation details...
}
これらは同等です:
SomeDisposableType t = new SomeDisposableType();
try {
OperateOnType(t);
}
finally {
if (t != null) {
((IDisposable)t).Dispose();
}
}
using (SomeDisposableType u = new SomeDisposableType()) {
OperateOnType(u);
}
2番目の方が読みやすく、保守しやすい。
他のヒント
Using
は、コードが例外をスローした場合でも、 using
ブロックが残った後に Dispose()
を呼び出します。
したがって、通常、IOのようにクリーンアップが必要なクラスには using
を使用します。
つまり、これはusingブロック:
using (MyClass mine = new MyClass())
{
mine.Action();
}
同じことをします:
MyClass mine = new MyClass();
try
{
mine.Action();
}
finally
{
if (mine != null)
mine.Dispose();
}
using
を使用すると、はるかに短く、読みやすくなります。
MSDNから:
C#、. NET Framework共通 言語ランタイム(CLR)、自動的に 格納に使用されたメモリを解放します 不要になったオブジェクト。 メモリの解放は 非決定論的;メモリが解放されます CLRが実行を決定するたびに ガベージコレクション。しかし、それは 通常、限定的にリリースするのがベスト ファイルハンドルなどのリソース できるだけ早くネットワーク接続 可能。
usingステートメントでは、 いつオブジェクトを指定するプログラマ 使用するリソースは解放する必要があります それら。使用に提供されるオブジェクト ステートメントは実装する必要があります IDisposableインターフェイス。このインターフェース Disposeメソッドを提供します。 オブジェクトのリソースを解放する必要があります。
つまり、 using
ステートメントは.NETに、 using
ブロックで指定されたオブジェクトが不要になったら解放するように指示します。
usingステートメントは、 IDisposable
インターフェイスを実装するC#のオブジェクトを操作するために使用されます。
IDisposable
インターフェースには、オブジェクトの破棄に使用される Dispose
という1つのパブリックメソッドがあります。 usingステートメントを使用する場合、コード内でオブジェクトを明示的に破棄する必要はありません。usingステートメントがそれを処理します。
using (SqlConnection conn = new SqlConnection())
{
}
上記のブロックを使用すると、内部的に次のようにコードが生成されます。
SqlConnection conn = new SqlConnection()
try
{
}
finally
{
// calls the dispose method of the conn object
}
詳細については、 C#の「using」ステートメントを理解するを参照してください。
また、 using
によってインスタンス化されたオブジェクトは、usingブロック内では読み取り専用であることに注意してください。公式のC#リファレンスこちらを参照してください。
usingブロックにコードを配置すると、コントロールがブロックを離れるとすぐにオブジェクトが破棄されます(必ずしも収集されるとは限りません)。
using (B a = new B())
{
DoSomethingWith(a);
}
は同等です
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
実際には、IDisposableを実装するメンバーでDisposeを明示的に呼び出す必要のない構文糖衣です。
usingステートメントは、1つ以上のリソースを取得し、ステートメントを実行してから、リソースを破棄します。