3

実用性のための両方のクラスは使い捨てです。

using ブロックの機能を理解しています。しかし、それを使用できる、または使用する必要があるすべての方法についてはわかりません。

たとえば、これは正しいですか?

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     SecondClass myClassSecond = new SecondClass(params);
     myClassSecond.name = "George";
     myClassSecond.msg = "Hello Man in the Yellow Hat";
}

上記の両方のクラスは破棄されますか?

それとも、using ステートメント内で両方が必要ですか?

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     using (SecondClass myClassSecond = new SecondClass(params))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}

上記は正しいですか、または複数の using ステートメントを使用するより良い方法はありますか?

4

9 に答える 9

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

using ステートメントの使用例を次に示します。

using System;
//Object of this class will be given to using hence IDisposable
class C : IDisposable        
{
    public void UseLimitedResource()
    {
        Console.WriteLine("Using limited resource...");
    }

    //Dispose() Method
    void IDisposable.Dispose()
    {
        Console.WriteLine("Disposing limited resource.");
    }
}

class Program
{
    static void Main()
    {
        using (C c = new C())  //Object of Class defined above
        {
            c.UseLimitedResource();
            //Object automatically disposed before closing.
        }                            
        Console.WriteLine("Now outside using statement.");
        Console.ReadLine();
    }
}

using ステートメントは、次のいずれかの場合に終了できます。

  • ステートメントの終わりにusing達したか、
  • 例外がスローされ、制御がステートメントの終了前にステートメント ブロックを離れた場合。

適切な方法はどれか。

おっしゃる通り

実用性のための両方のクラスは使い捨てです

. の場合、2 番目のアプローチが適切です。あれは:

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     using (SecondClass myClassSecond = new SecondClass(params))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}
于 2013-06-12T15:15:13.320 に答える
3

SecondClass が実際に使い捨て可能であると仮定すると、2番目の例は適切です。mySecondClass は破棄されないため、最初の例は正しくありません。コードのブロックが使い捨てインスタンスの有効期間を制御する場合、常にそれを破棄する必要があります。

参考までに、同じブロックに複数のオブジェクトを配置するには、このスタイルの方が読みやすいので、このスタイルを好みます。

using (MyClass myClass = new MyClass(params))
using (SecondClass myClassSecond = new SecondClass(params))     
{
     myClassSecond.name = "George";
     myClassSecond.msg = "Hello Man in the Yellow Hat";     
}

どちらもusings同じスコープを共有し、宣言の逆順で Dispose します。

于 2013-06-12T15:14:14.790 に答える
3

IDisposableブロックを使用すると、インターフェイスを実装するものを操作するときに便利です。MSDN :

[using ステートメント] スコープを定義し、その外側で 1 つまたは複数のオブジェクトが破棄されます。

したがって、これらは事実上

IDisposable resource = new Whatever();
try {
    // whatever
}
finally {
    resource.Dispose();
}

の主な利点は次のusingとおりです。ブロックを離れるときにオブジェクトが自動的に破棄されるusingため、(1) 忘れることがなく、(2) 例外が発生した場合にクリーンアップが実行されます。

短いルール:

  • ファイル/データベース接続を開くか、何らかの種類のクリーンアップが必要なクラスのインスタンスを作成するときはいつでも、usingブロックで実行してください。
  • オブジェクトの有効期間がメソッド スコープを拡張する必要がある場合は、オブジェクトをクラスにラップし、そのクラスに実装IDisposableし、コンストラクターでリソースをインスタンス化し、Dispose.
于 2013-06-12T15:14:47.083 に答える
2

A using block does not automatically dispose any child objects that implement IDisposable. You have to wrap inner disposables in using blocks if you want them disposed. You do, however, have a few different options for this.

You could nest multiple using blocks and they are evaluated inner-most to outer-most. There is a better way to do this, but the following example works:

using (MyClass myClass = new MyClass(parameters))
{
     using (SecondClass myClassSecond = new SecondClass(parameters))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}

If the declarations are consecutive and you don't need to do anything in between, the following syntax is more succinct:

using (MyClass myClass = new MyClass(parameters))
using (SecondClass myClassSecond = new SecondClass(parameters))
{
    myClassSecond.name = "George";
    myClassSecond.msg = "Hello Man in the Yellow Hat";
}

If you need to do something in between the declarations, then your latter example is correct:

using (MyClass myClass = new MyClass(parameters))
{
     myClass.name = "Steve";

     using (SecondClass myClassSecond = new SecondClass(parameters))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}
于 2013-06-12T15:18:01.860 に答える
0

このusingブロックは、IDisposable オブジェクトを処理する純粋に構文的に単純な方法です。何をするかを理解すればusing、それをどのように使用できるか、また使用する必要があるかを理解する必要があります。

ブロックが正確に何にusing変換されるかについては、この質問を参照してください: Uses of "using" in C#

于 2013-06-12T15:15:58.050 に答える
0

IDisposable多くのリソースを使用する場合、またはファイル処理またはネットワーク リソースのラッパーとして作成する場合は、作成するクラスに実装するのが好きです。

using私が使用しているクラスオブジェクトでは、問題のオブジェクトがファイルを開く、ネットワーク接続を作成するなどの場合、ブロックで呼び出すことが重要だと思います。

IDisposable一部の開発者は、自分のコードをすっきりとした見た目のブロックに配置できるようにするためだけに実装するクラスをusing作成しますが、これは使い捨てのものを作成する理由を悪用していると思います。

于 2013-06-12T15:20:59.067 に答える
0

それは、それらのクラスが何であるか、およびそれらが使用するリソースをどのように破棄するかによって異なります。このステートメントは、ブロック内のリソースを(問題のオブジェクトを呼び出すことによって) 破棄するブロック (no )usingと本質的に同じものです。try/finallycatchfinally.Dispose()

まず第一に、問題のクラスが実装されていない場合、IDisposableそれは議論の余地があります。その場合、ブロックで使用することはできません。using実装する場合IDisposable、何らかの理由で実装する可能性があり、処理.Dispose()が完了したときにそのオブジェクトで呼び出す必要があります。そのような場合は、破棄usingを保証するためにブロックでラップするのが賢明です。(まあ、finallyブロックが実行される限り「保証」されます。もっと悪いことが起こっていない限り、通常はそうです。)

于 2013-06-12T15:16:01.287 に答える
0

簡単な答えは、クラスに dispose メソッドがある場合は、using を使用することです。

http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

そうでない場合は、必要ありません。

http://msdn.microsoft.com/en-us/library/system.random.aspx

MSDN のドキュメントで、これがもっとあなたの顔に出てくることをいつも願っていました。結局のところ、IDisposable を実装するのはクラスですが、実際に私が必要としているのは、何らかの形でページに表示される巨大なアイコンのようなものです。「注意ダミー!あなたはこれを自分で管理しなければなりません!

于 2013-06-12T15:13:54.190 に答える