2

public static Rectangle DrawRectangle(Vector origin, Vector size)タイプのオブジェクトを返すメソッドがあると仮定しますRectangle : IDisposable

メソッドのみを呼び出しDrawRectangle(origin, size)、戻り値を変数に代入しない場合myRectangle = DrawRectangle(origin, size)、コンパイラはこれを自動的に検出して呼び出しますDrawRectangle(origin, size).Dispose()か、それとも自分で行う必要がありますか?

4

5 に答える 5

3

Rectangleクラスが実装されている場合は、可能な場合はステートメントIDisposableを試してくださいusing( ) { ... }

Msdnリンク

于 2013-01-07T09:28:42.533 に答える
3

意味が無い。

最終的に彼はファイナライザーを行いますが、そうではありません。自動的に Dispose を呼び出すわけではありません。

于 2013-01-07T09:27:03.237 に答える
2

コンパイラはコードをアセンブリに組み込みますが、実行には関与しません。.net ランタイムはコードを実行するものであり、より具体的には、ガベージ コレクターがメモリのクリーンアップを処理します。通常、using ブロック内で IDisposable を実装するオブジェクトを呼び出すことをお勧めします。例えば:

using (var obj = new object) { ... 自分のことをする }

これにより、オブジェクトがスコープ外に出て早期にクリーンアップするタイミングをランタイムが理解するのに役立ちますが、オブジェクトへの参照を保持しない限り、ランタイムは最終的にオブジェクトをクリーンアップして破棄します。

于 2013-01-07T09:33:48.963 に答える
1

コンパイラが自動的に dispose を呼び出すシナリオは 2 つしかないと思います。最も明白なのは次のとおりです。

using(var obj = ... )
{
  // some code
}

これは、「最後に、成功または失敗にかかわらず、objnull 以外の場合は呼び出すobj.Dispose()」という明示的な指示です。基本的には次のように展開されます。

{
   var obj = ...
   try {
       // some code
   } finally {
       if(obj != null) obj.Dispose();   
   }
}

もう 1 つはforeachで、イテレータが破棄されます - 少し複雑になりますが、それが必要であることを指定してIEnumeratorないIDisposableため (対照的に、それを指定している)、技術的には では必要でさえありませんが、基本的には次のとおりです。IEnumerator<T> IEnumerableforeach

foreach(var item in sequence) {
   // some code
}

次のように表現できます (ただし、仕様では多少異なる場合があります)。

{
    var iter = sequence.GetEnumerator();
    using(iter as IDisposable)
    {
        while(iter.MoveNext())
        {   // note that before C# 5, "item" is declared *outside* the while
            var item = iter.Current;
            // some code
        }
    }
}

それ以外の場合はすべて、リソースの処分はユーザーの責任です。

が確実に呼び出されない場合Dispose()、GC が最終的にオブジェクトを収集するまで何も起こりません。ファイナライザーがある場合(存在する必要はなく、通常は存在しません)、ファイナライザーが呼び出されますが、それは とは異なりDispose()ます。(型ごとの実装に応じて) : と同じことをDispose()することになるかもしれませんが、そうではないかもしれません。

于 2013-01-07T09:38:35.573 に答える
1

CLR で Dispose メソッドを呼び出す場合は、通常、いわゆるDispose パターンをクラスに実装することをお勧めします。ただし、私は CLR に依存せず、GC がオブジェクトを収集して代わりにusing句を使用するのを待ちません。

于 2013-01-07T09:33:30.933 に答える