1

これが、オブジェクトを内部から終了するための受け入れ可能な方法であるかどうか疑問に思っていますか? 以来

this = null;

不可能です。私は通常、discarded または何かと呼ばれる bool を設定し、オブジェクトを終了した後にアクセスされた場合に例外をスローします。しかし、これは私に起こり、それはよりクリーンな解決策かもしれないと思いましたが、少しハックなように見えるので、セカンドオピニオンが必要でした. ブール値の設定に固執するか、これを使用する必要があります。これにより、ガベージ コレクターがオブジェクトをクリーンアップすることもできます。

public class A
{
    public A()
    {

    }

    public void Method()
    {
        try
        {
            //Do Something.
        }
        catch
        {
            //If it fails destroy the object
            Destroy(this);
        }
    }

    private static void Destroy(A a)
    {
        a = null;
    }
}
4

2 に答える 2

7

a参考書のコピペです。好きなように設定してnullください。元の参照には影響しません。もちろん、メソッド シグネチャを変更して引数を byrefで取得することもできますが、なぜこれを行う必要があるのでしょうか。ここであなたが解決しようとしている問題が何か想像できません。

これにより、ガベージ コレクターがオブジェクトをクリーンアップすることもできます。

GC は への参照を設定する必要はありませんnull。このアイデアでは何も達成していません。あなたは参照のコピーをいじっています。オブジェクトはまだメモリ内にあり、現在の値がnull.

詳細については、この SO スレッドを参照してください。

于 2012-07-23T00:39:11.863 に答える
2

明示的で決定論的な破棄が必要な場合は、インターフェイス IDisposable を実装し、オブジェクトの処理が完了したら Dispose を呼び出します。そうしないと、ガベージ コレクターは、最後の参照がスコープ外になるとすぐにオブジェクトを破棄します。null特定の ref を ing しても、コレクションはトリガーされません。確実にそうしなければならないことがわかっていない限り、ガベージコレクターを推測しないでください。

できるだけ早く破壊したいオブジェクトには何がありますか? データベース接続、ソケット、数百 MB のメモリ チャンクなど、必要以上に長く保持する余裕がないリソースはほとんどありません。それらのために、IDisposable が存在します。残りのオブジェクトは、GC が到達するまで数ミリ秒間存続します。これがガベージコレクションの世界での生活です。2012 年には、これは許容可能なトレードオフと見なされます。

于 2012-07-23T00:45:21.760 に答える