ホームページ  >  記事  >  バックエンド開発  >  C# のデストラクター

C# のデストラクター

WBOY
WBOYオリジナル
2024-09-03 15:12:58927ブラウズ

記事「C# のデストラクター」では、その名前が示すように、デストラクターはオブジェクトを破棄する C# のメソッドです。オブジェクトが不要になった場合は、デストラクターが呼び出され、それらのオブジェクトがクラスから破棄されます。デストラクターはガベージ コレクターによって自動的に呼び出され、オブジェクトを破棄します。

構文:

class Demo
{
// other methods
~Demo()  // destructor
{
// your code
}
}

C# のデストラクターは Finalize( ) メソッドのショートカットです。したがって、デストラクター

を宣言すると、
~Demo()   // destructor
{
// your code
}

C# コンパイラは次のように変換します:

protected override void Finalize()
{
try
{
// your code
}
finally
{
base.Finalize();
}
}

デストラクターは ~ (チルダ) で表されます。

C# のデストラクターのプロパティ

デストラクターのプロパティは次のとおりです:

  1. デストラクターにはパラメータやアクセス修飾子を含めることはできません。
  2. 各クラスは 1 つのデストラクターのみで構成されている必要があります。
  3. デストラクターはオーバーロードまたは継承できません。
  4. デストラクター名は常にクラス名と同じであり、戻り値の型はありません。
  5. デストラクターは Finalize メソッドを使用し、オブジェクトが不要になったときにガベージ コレクターによって呼び出されます。
  6. デストラクターは逆のパターンに従います。デストラクターでは、派生クラスが最初に呼び出され、次に基本クラスが呼び出されます。

C# ではデストラクターはどのように動作しますか?

C# でどのように動作するかを示す例をいくつか示します。

例 #1

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class person
{
//variables
public string name;
public int age;
public person(string name,int age)   //parametrized constructor
{
this.name = name;
this.age = age;
}
public string getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
~person()      // destructor
{
Console.WriteLine("Destructor has been invoked");
}
}
class Program
{
// main method
static void Main(string[] args)
{
person Details = new person("Joe", 28);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
}
}
}

上記の例では、パラメーター化されたコンストラクターがパラメーター名と age で初期化されます。これはクラス変数を参照するキーワードです。その後、クラス名とシンボル ~ と同じ名前でデストラクターが作成されます。 mainメソッドにはpersonクラスのオブジェクトがあります。人の名前と年齢を取得すると、オブジェクトは必要なくなります。したがって、オブジェクトを破棄し、そのメモリの割り当てを解除するデストラクターが呼び出されています。

出力:

C# のデストラクター

例 #2

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
anmespace Destructor
{
class person
{
// variables
public string name;
public int age;
public person(string name,int age) // parameterized constructor
{
this.name = name;
this.age = age;
}
public string getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
~person()     //destructor
{
Console.WriteLine("Descructor has been invoked");
}
}
class Program
{
// Main method
static void Main(string[] args)
{
person Details = new person("Joe", 28);    // first object
person Details1 = new person("John", 20);
Console.WriteLine(Details.getName());
Console.WriteLine(Details.getAge());
Console.WriteLine(Details1.getName());
Console.WriteLine(Details1.getAge());
}
}
}

この例は前の例とほぼ同じですが、この例では main メソッドに 2 つのオブジェクトがあります。ご存知のとおり、コンストラクターはすべてのオブジェクトに対して実行され、これと同じことがデストラクターにも適用されます。この場合、デストラクターが 2 回呼び出され、各オブジェクトのメモリの割り当てが解除されます。

出力:

C# のデストラクター

例 #3

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
public class Parent
{
~Parent()   // base destructor
{
Console.WriteLine("Parent.~Parent()");
}
}
public class Child : Parent
{
~Child()  // derived destructor
{
Console.WriteLine("Child.~Child()");
}
}
public class MainClass
{
static void Main()
{
Child child = new Child();
}
}
}

上記の例では、デストラクターを持つ親クラスが定義されています。次に、子クラスは親クラスを継承し、デストラクタも構成されます。したがって、子デストラクターは自動的に基本デストラクターを呼び出します。

コンストラクターでは、基本コンストラクターが最初に呼び出されます。たとえば、クラス B によって継承される基底クラス A がある場合、コンストラクターの場合はクラス A が最初に呼び出され、次にクラス B が呼び出されます。ただし、デストラクターの場合は、クラス A の前にクラス B (派生クラス) が最初に呼び出されます (基本クラス)。

注文執行の別の例:-

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class Tree
{
~Tree()
{
System.Console.WriteLine("This is the first destructor");
}
}
class Branch: Tree
{
~Branch()
{
System.Console.WriteLine("This is the second destructor");
}
}
class Flower: Branch
{
~Flower()
{
System.Console.WriteLine("This is the third destructor");
}
}
class Test
{
static void Main()
{
Flower f= new Flower();
}
}
}

出力:

C# のデストラクター

ご覧のとおり、最初に 3 番目のコンストラクターが呼び出され、続いて 2 番目と最初のコンストラクターが呼び出されます。

例 #4

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Destructor
{
class Example
{
public Example()
{
// constructor
Console.WriteLine("Object Created");
}
// Destructor
~Example()
{
Console.WriteLine("Object Destroyed");
}
}
class Program
{
public static void Sample()
{
Example ex = new Example();
}
static void Main(string[] args)
{
Sample();
GC.Collect();
Console.ReadLine();
}
}
}

出力:

C# のデストラクター

プログラムの終了時にオブジェクトのメモリが必要ない場合、デストラクタはオブジェクトのメモリの割り当てを解除します。しかし、プログラムの実行中に GC.Collect() を使用すると、途中でオブジェクトが破棄され、それらのオブジェクトのメモリの割り当てが解除されることがあります。デストラクターは暗黙的または明示的に呼び出すことができます。ただし、C# にはガベージ コレクションが備わっているため、オブジェクトを明示的に破棄する必要はありません。ただし、管理対象外のリソースを使い終わったら、それらを明示的に解放する必要があります。管理対象リソースを呼び出す必要はありません。アンマネージ リソースを処理するにはデストラクターを使用します。ガベージ コレクターは、デストラクターを持つオブジェクトのリストで構成されるため、デストラクターを呼び出します。したがって、オブジェクトが作成または破棄されるたびに、そのリストは更新されます。キュー内にオブジェクトがある場合、デストラクターの実行後にガベージ コレクターによって収集されます。

結論

デストラクターの主な目的は、オブジェクトの実行後にオブジェクトのメモリを解放することです。そのため、デストラクターでは、スペースの回復、ネットワーク リソースやリソース ロックの解放など、さまざまなアクションが実行されます。デストラクターは、管理対象リソースではなく、管理対象外リソースを解放するために使用する必要があります。

おすすめ記事

これは C# のデストラクターのガイドです。ここでは、C# のデストラクターの概要、プロパティ、例について説明します。 詳細については、他のおすすめ記事を参照することもできます –

  1. Java のデストラクター
  2. C# での継承
  3. C# でコンストラクターをコピー
  4. Python のデストラクター

以上がC# のデストラクターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。