2

Dispose と Finalize の間で神経質になっています。これが私のコード例です:

public class Car:IDisposable
    {
        public string name;
        public Car()
        {
            name = "My Car";
        }
        public void Dispose()
        {
            Console.WriteLine("This object has been disposed");
        }
    }
public static void Main()
        {
            Car anotherCar;
            using (var car = new Car())
            {
                anotherCar = car;
                Console.WriteLine("Before dispose. Name is: "+anotherCar.name);
            }

            Console.WriteLine("After dispose. Name is: "+anotherCar.name);

        }

結果は次のとおりです。

Before dispose. Name is My Car
This object has been disposed
After dispose. Name is My Car

私の質問は: C# は の後にオブジェクトを自動的に破棄するusing{}ため、「破棄後」の行で考えます。anotherCar.nameNULL でなければなりません。なぜまだ「マイカー」なのですか?

もう 1 つの質問は、私の本にはGC.Collect()、何らかの理由で使用すべきではないと書かれていますが、そのうちの 1 つはパフォーマンスです。では、誰が object を処分するのでしょうか? dipose()それがガベージコレクターの場合も、同じパフォーマンスの問題があると思いますfinalizer()

ありがとう :)

4

3 に答える 3

6

Disposeが実際に何をしているのか誤解していると思います。オブジェクトを破壊したり、nullに設定したり、その他の方法で魔法を実行したりすることはありません。usingステートメントを使用すると、Disposeが呼び出されることが保証されます。Disposeメソッドで行うことは、オブジェクトの動作を決定するものです。言語や.NETFrameworkではありません。

于 2012-05-26T19:47:01.820 に答える
4

コードをもう一度見ると、Dispose()メソッドをクラスに配置し、IDisposableを実装するだけでは、舞台裏の魔法は追加されないことがすぐにわかります。これは、次の場所で呼び出される便利な通常のメソッドです。 usingステートメントの終わり。

通常、Disposeメソッドでは、自分で解放したい(管理されていない)リソースをクリアする必要があります。たとえば、db接続や読み取り/保存用に開いていたファイルを閉じます...

Microsoftには、IDisposableを正しく実装するための優れたヘルプページがあります。

于 2012-05-26T19:47:25.040 に答える
3

.net のオブジェクトは、通常、型参照と、その型に必要な public および private フィールドの組み合わせです (配列や文字列などの特殊なケースがいくつかあります)。作成されると、.net 内のオブジェクトは、それへの何らかの形式の参照が存在する限り存在し続けます。オブジェクトへの参照がなくなると、 if は事実上存在しなくなります。占有されていたメモリは、単に未使用のメモリになり、次のガベージ コレクションで再利用できます。

の目的はDispose、オブジェクトを破壊することではなく、オブジェクトが消える前に、それ自体の外部にあるものに対して必要なアクションを実行できるようにすることです。簡単な例として、オブジェクトがリモート サーバーにファイルへの排他的アクセスを許可するように要求したとします。サーバーはトークンを提供し、そのトークンを提供するコードにのみアクセスが許可されることを約束します。オブジェクトが単純に消えた場合、外部サーバーは、もはや存在しないトークンを保持するコードを排他的に使用するためにファイルをロックしたままにします。つまり、ファイルは永久に (*) 誰にも使用できなくなります。トークンを要求するメソッドをオブジェクトに追加するDisposeと、オブジェクトはサーバーに「わかりました。ファイル XYZ1493 は完了しました」というメッセージを送信できるため、他のエンティティがファイルを使用できるようになります。

Dispose メソッドは実際にはファイル オブジェクトを破棄しないことに注意してください。フィールドに保存されているデータの一部を消去するようにオブジェクトに促す可能性がありますが、オブジェクトへの参照が存在する限りオブジェクトは存在し続け、その後は存在しなくなります。オブジェクトで Dispose を呼び出すと、オブジェクトへの参照を保持している他の外部オブジェクトにそれらの参照を破棄するように要求することにより、オブジェクト自体の消滅が早まる場合があります。ただし、そのような場合でも、Dispose の目的は、オブジェクトが他のものに要求を発行できるようにすることです。

于 2012-05-27T17:16:43.157 に答える