3

C# では、使い終わったオブジェクトを常に破棄する必要がありますか? そうでない場合、どのような条件でオブジェクトを破棄してデストラクタを呼び出す必要がありますか? オブジェクトを破壊しないとどうなりますか? 長所と短所は何ですか?

簡単な例:

Help h = new Help();

h.program_name = "myprogram.exe";
h.release_date = "01/10/2013";
h.version_number = "1.2.0.0"; 

if (args.Length > 0)
{
    if ((args[0] == "-help") || (args[0] == "-version")||(args[0] == "/?"))
    {
        h.writeline();
    }
}
4

5 に答える 5

11

オブジェクトがIDisposableインターフェイスを実装していない限り、使い終わったら何もする必要はありません。

ガベージ コレクターにその仕事をさせれば、すべてが順調に進みます。

于 2013-01-09T16:34:38.910 に答える
5

アンマネージ リソースを処理するオブジェクトのみを明示的に破棄する必要があります。これらの型は、IDisposable インターフェイスを実装する必要があります。これらのオブジェクトを処理する良い方法は、次のusingキーワードを使用することです。

using (SqlConnection conn = new SqlConnection(...))
{
    // ...do stuff with conn
}  // conn.Dispose() will automatically be called here
于 2013-01-09T16:36:22.833 に答える
2

一般に、C# はガベージ コレクターを使用するため、オブジェクトを手動で "破棄" する必要はありません。

場合によっては、ネットワーク/データベース接続、開いているファイルなど、一部のオブジェクトに関連付けられているリソースをすぐに解放したい場合があります。多くの場合、'using' を使用するのが最善の方法です。

于 2013-01-09T16:36:34.210 に答える
0

C# では、常に破棄する必要はありませんが、必要な場合にのみ破棄してください。通常、クラスを設計するときは、必要に応じて実際のクリーンアップを行うIDisposableインターフェイスを宣言して実装します。クラス インスタンスが割り当てる可能性のあるアンマネージ リソースを処理する必要があり、オーバーロードされたDispose ( )メソッドは、それらを処理して割り当てを解除するのに最適な場所です。

Dispose()メソッドは、クラッシュすることなく複数回呼び出すことができるように設計する必要があるため、細心の注意を払い、null 値に対するオブジェクト参照を確認してください。これはコード全体で良い方法ですが、Dispose() メソッドにはこれに関してもっと注意が必要です。

于 2013-01-09T16:48:53.973 に答える
0

前述のようにGC、C# にはオブジェクトをクリーンアップする機能があります。

にはデストラクタはありませんが、オブジェクトが収集されたときに呼び出されるものがありますC#finalizerただし、ほとんどの場合、ファイナライザーを実装する必要はありません。

Finalize メソッドに関する情報: http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

オブジェクトの破棄に特定の動作が必要な場合 (たとえば、アンマネージ リソースのクリーンアップ)、Finalize メソッドを実装する必要があります。

これはあなたがそれを行う方法です: http://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx

Finalize の実装に注意してください。GC がこのオブジェクトをクリーンアップするために二重の作業が発生します。

于 2013-01-09T16:52:24.377 に答える