306

UsingC# のブロックの目的は何ですか? ローカル変数とどう違うのですか?

4

9 に答える 9

365

型が 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();
于 2008-10-17T13:51:33.387 に答える
121

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と、はるかに短くなり、読みやすくなります。

于 2008-10-17T13:50:55.043 に答える
51

MSDN から:

C# は、.NET Framework 共通言語ランタイム (CLR) を通じて、不要になったオブジェクトの格納に使用されているメモリを自動的に解放します。メモリの解放は非決定論的です。CLR がガベージ コレクションの実行を決定するたびに、メモリが解放されます。ただし、通常は、ファイル ハンドルやネットワーク接続などの限られたリソースをできるだけ早く解放することをお勧めします。

using ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

つまり、このusingステートメントは、usingブロックで指定されたオブジェクトが不要になったら解放するように .NET に指示します。

于 2008-10-17T13:53:41.200 に答える
29

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」ステートメントを理解する」を参照してください。

于 2012-01-13T00:01:38.670 に答える
10
using (B a = new B())
{
   DoSomethingWith(a);
}

と同等です

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}
于 2008-10-17T13:54:22.617 に答える
5

コードを using ブロックに配置すると、制御がブロックを離れるとすぐにオブジェクトが破棄されます (必ずしも収集されるとは限りません)。

于 2008-10-17T13:51:03.263 に答える
2

using ステートメントは、1 つ以上のリソースを取得し、ステートメントを実行してから、リソースを破棄します。

于 2009-10-05T06:45:47.433 に答える
2

IDisposable を実装するメンバーで Dispose を明示的に呼び出す必要がないのは、実際には単なるシンタックス シュガーです。

于 2008-10-17T13:53:44.490 に答える