Using
C# のブロックの目的は何ですか? ローカル変数とどう違うのですか?
9 に答える
型が 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 つ目は、読みやすく維持しやすいものです。
C# 8 以降、コードをより読みやすくするための新しい構文があります。using
using var x = new SomeDisposableType();
{ }
独自のブロックはなく、使用の範囲は、宣言の時点から宣言されているブロックの最後までです。つまり、次のようなことを避けることができます。
string x = null;
using(var someReader = ...)
{
x = someReader.Read();
}
そしてこれを持ってください:
using var someReader = ...;
string x = someReader.Read();
Using
コードが例外をスローした場合でも、 -block が残っDispose()
た後に呼び出します。using
したがって、通常はusing
、IO など、後でクリーンアップする必要があるクラスに使用します。
したがって、これはブロックを使用しています:
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 ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。
つまり、このusing
ステートメントは、using
ブロックで指定されたオブジェクトが不要になったら解放するように .NET に指示します。
usingステートメントは、インターフェイスを実装するC#のオブジェクトを操作するために使用されIDisposable
ます。
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 (B a = new B())
{
DoSomethingWith(a);
}
と同等です
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
コードを using ブロックに配置すると、制御がブロックを離れるとすぐにオブジェクトが破棄されます (必ずしも収集されるとは限りません)。
using ステートメントは、1 つ以上のリソースを取得し、ステートメントを実行してから、リソースを破棄します。
IDisposable を実装するメンバーで Dispose を明示的に呼び出す必要がないのは、実際には単なるシンタックス シュガーです。