C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でのファイナライズと破棄の違いは何ですか?


ファイナライズ

Finalize()は、コレクションに適格なオブジェクトが再利用される前に、ガベージコレクターによって呼び出されます。ガベージコレクタは、参照されていないオブジェクトのメモリの割り当てを解除する責任を負います。ガベージコレクタは、メモリ内にそのオブジェクトへの有効な参照がなくなった後のある時点でこのメソッドを呼び出します。

フレームワークは、これが発生したときにガベージコレクションを強制できることを保証しませんが、プログラムのパフォーマンスを低下させます。 Finalize()はObjectクラスに属し、ランタイムによって呼び出されます。

using System;
namespace DemoApplication{
   public class Demo{
      ~Demo(){
         Console.WriteLine("Finalize called");
      }
   }
}

廃棄

Windowsハンドル、データベース接続、ネットワーク接続、ファイルなど、ガベージコレクターで収集できないリソースがいくつかあります。特定のオブジェクトを明示的にリリースする場合は、IDisposableを実装し、IDisposableインターフェイスのDispose()メソッドをオーバーライドするのが最適です。

Dispose()メソッドは自動的に呼び出されないため、オブジェクトが不要になったときにクライアントアプリケーションから明示的に呼び出す必要があります。オブジェクトへの他の参照が有効な場合でも、Dispose()を呼び出すことができます。

using System;
namespace DemoApplication{
   public class Demo : IDisposable{
      private bool disposed = false;
      public void Dispose(){
         Dispose(true);
         GC.SuppressFinalize(this);
      }
      protected virtual void Dispose(bool disposing){
         if (!disposed){
            if (disposing){
               //clean up managed objects
            }
            //clean up unmanaged objects
            disposed = true;
         }
      }
   }
}

管理されていないリソースを操作する場合は、DisposeとFinalizeの両方を実装することをお勧めします。開発者がDisposeメソッドを明示的に呼び出さなかった場合でも、オブジェクトがガベージコレクションされると、Finalize実装が実行され、リソースが解放されます。


  1. DirectX11とDirectX12の違いは何ですか?

    DirectXは、マルチメディアコンテンツをレンダリングし、グラフィカルハードウェアと通信するためにソフトウェアによって使用されるAPIまたはアプリケーションプログラミングインターフェイスのコレクションです。 DirectXの主要コンポーネントAPIであるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を処理します。すべてのハードウェアが異なるため、関数と呼び出しの標準化されたライブラリを使用してグラフィックカードと通信すると、ゲーム開発がスピードアップします。これはハードウェアアブストラクションと呼ばれ、APIの主な仕事です。 車について考えてみましょう。1台の車を運転

  2. C#のリストと配列の違いは何ですか?

    配列は同じタイプの要素の固定サイズのシーケンシャルコレクションを格納しますが、リストはジェネリックコレクションです。 リストを定義するには- List<string7gt; myList = new List<string>(); リストに要素を設定するには、Addメソッド-を使用する必要があります myList.Add("Audi"); myList.Add("BMW"); myList.Add("Chevrolet"); myList.Add("Hyundai"); 配列を定義するには-