坂本  健一

坂本 健一

1641533220

C#のコンストラクタとデストラクタ

オブジェクトが作成されるたびに、コードを自動的に実行する場合は、コンストラクターを使用できます。実行するコードはコンストラクターに配置する必要があります。C#コンストラクターの一般的な形式は次のとおりです 

修飾子constructor_name(パラメーター)
{
//コンストラクター本体
}

修飾子は、private、public、protected、internalのいずれかになります。コンストラクターの名前は、クラスが定義されているクラスの名前である必要があります。コンストラクターは、0個以上の引数を取ることができます。引数がゼロのコンストラクター(つまり、引数なし)は、デフォルトのコンストラクターと呼ばれます。コンストラクターの戻り型はないことに注意してください。 

次のクラスには、2つの引数を取るコンストラクターが含まれています。 

class Complex
{
private int x;
private int y;
public Complex (int i, int j)
{
x = i;
y = j;
}
public void ShowXY ()
{
Console.WriteLine(x + "i+" + y);
}
}

次のコードセグメントは、コマンドプロンプトに20 + i25を表示します。  

Complex c1 = new Complex (20,25);
c1.ShowXY (); // Displays 20+i25

つまり、Complexクラスのオブジェクトを作成すると、コンストラクターが自動的に呼び出され、そのデータメンバーxとyが初期化されます。コンストラクタは主にオブジェクトの初期化に使用されていると言えます。コンストラクター内で非常に複雑な計算を行うことも可能です。コンストラクター内のステートメントも例外をスローする可能性があります。 

クラスにコンストラクターを提供しない場合、C#は、クラスのオブジェクトを作成するための空の本体を持つデフォルトのコンストラクターを提供します。独自のコンストラクターを提供する場合、C#はデフォルトのコンストラクターを提供しないことに注意してください。 

完全なプログラムを以下に示します

// C# constructor example
// Author: rajeshvs@msn.com
using System;
class Complex
{
private int x;
private int y;
public Complex(int i, int j) // constructor with 2 arguments
{
x = i;
y = j;
}
public void ShowXY()
{
Console.WriteLine(x +"i+" + y);
}
}
class MyClient
{
public static void Main()
{
Complex c1 = new Complex(20,25);
c1.ShowXY();
}
}

コンストラクターのオーバーロード 

メンバー関数と同様に、コンストラクターもクラスでオーバーロードできます。オーバーロードされたコンストラクターは、引数の数および/または引数のタイプおよび/または引数の順序が異なる必要があります。 

次のプログラムは、オーバーロードされたコンストラクターの動作を示しています。 

// C# constructor overloading
// author: rajeshvs@msn.com
using System;
class Complex
{
public Complex(int i, int j)
{
Console.WriteLine("constructor with 2 integer arguemets");
}
public Complex(double i, double j)
{
Console.WriteLine("constructor with 2 double arguments");
}
public Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c1 = new Complex(20,25);// displays 'constructor with 2 integer arguments'
Complex c2 = new Complex(2.5,5.9); // displays 'constructor with 2 double arguments'
Complex c3 = new Complex(); displays 'no argument constructor'
}
}

プライベートコンストラクター

C#では、コンストラクターをパブリック、プライベート、プロテクト、または内部として宣言できることはすでに見てきました。クラスがプライベートコンストラクタのみを宣言する場合、他のクラスがこのクラスから派生したり、このクラスのインスタンスを作成したりすることはできません。プライベートコンストラクターは、静的メンバーのみを含むクラスで一般的に使用されます。ただし、クラスにはプライベートコンストラクタとパブリックコンストラクタの両方を含めることができ、そのようなクラスのオブジェクトも作成できますが、プライベートコンストラクタを使用することはできません。

以下はC#で有効なプログラムです 

// C# constructor both private & public
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex(int i, int j)
{
Console.WriteLine("constructor with 2 integer arguments");
}
public Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c3 = new Complex();
}
}

ただし、次のプログラムにはプライベートコンストラクタのみが含まれているため、コンパイルされません。 

// C# constructor only private. Will show compilation error.
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c3 = new Complex();
}
}
public void Method1()
{
Console.WriteLine("Method of a non-abstract class");
}
}

コンストラクター連鎖

上記のプログラム全体は、C#がコンストラクターのオーバーロードをサポートしていることを示しています。C#では、1つのコンストラクターでも、同じクラスまたはこのクラスの基本クラスで別のコンストラクターを呼び出すことができます。これは、コンストラクターチェーンと呼ばれるものです。コンストラクターチェーンには、次のように特別なタイプの構文が使用されます。 

// C# constructor chaining
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex()
{
Console.Write("1");
}
private Complex(int x):this()
{
Console.Write("2");
}
public Complex(int x, int y):this(10)
{
Console.Write("3");
}
}
class MyClient
{
public static void Main()
{
Complex c = new Complex(10,20); // Displays 123
}
}

上記のプログラムでは、Complex(int x、int y)は、特別な構文 ':' this(arguments)を使用して、Complex(int x)コンストラクターを呼び出します。これにより、Complex()コンストラクターが呼び出されます。

静的コンストラクター 

これまで説明してきた通常のコンストラクターは、静的メンバーと非静的メンバーの両方の初期化に使用できます。ただし、C#は、クラスが最初にロードされるときに静的データメンバーを初期化するために、静的コンストラクターと呼ばれる特別なタイプのコンストラクターを提供します。他の静的メンバー関数と同様に、静的コンストラクターは非静的データメンバーに直接アクセスできないことに注意してください。 

静的コンストラクターの名前はクラスの名前である必要があり、それらにも戻り型はありません。キーワードstaticは、静的コンストラクターを通常のコンストラクターと区別するために使用されます。静的コンストラクターは引数を取ることができません。つまり、引数のない静的コンストラクターの形式は1つだけです。他の方法では、静的コンストラクターをオーバーロードすることはできません。

静的コンストラクターと一緒にアクセス修飾子を使用することはできません。 

例えば

// C# static constructor
// Author: rajeshvs@msn.com
using System;
class Complex
{
static Complex()
{
Console.WriteLine("static constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c;
Console.WriteLine("RAJESH");
c = new Complex();
}
}

上記のプログラムの出力は次のとおりです。

RAJESH
static constructor 

静的コンストラクターは、クラスが最初にロードされるときに呼び出されることに注意してください。ただし、静的コンストラクターの実行の正確な時間と順序を予測することはできません。これらは、クラスのインスタンスが作成される前、静的メンバーが呼び出される前、および派生クラスの静的コンストラクターが呼び出される前に呼び出されます。 

非静的コンストラクターと同様に、静的コンストラクターを相互に、または他の非静的コンストラクターとチェーンすることはできません。基本クラスの静的コンストラクターは、派生クラスに継承されません。 

コンストラクターと継承 

静的コンストラクターと非静的コンストラクターはどちらも、基本クラスから派生クラスに継承されません。ただし、派生クラスの非静的コンストラクターは、特殊関数base()を使用して、基本クラスの非静的コンストラクターを呼び出すことができます。派生クラスから基本クラスのデフォルトコンストラクターとパラメーター化コンストラクターの両方を呼び出すことができます。基本クラスコンストラクターを明示的に呼び出さない場合、派生クラスコンストラクターは、派生クラスのオブジェクトが作成されるときに、基本クラスのデフォルトコンストラクターを暗黙的に呼び出します。これは、以下のプログラムに示されています。 

// C# Implicit call of base class default constructor
// Author: rajeshvs@msn.com
using System;
class Base
{
public Base()
{
Console.WriteLine("base constructor");
}
}
class Derived : Base
{
}
class MyClient
{
public static void Main()
{
Derived d1 = new Derived();//Displays 'base constructor'
}
}

以下に示すように、base()を使用して、基本クラスのコンストラクターを明示的に呼び出すこともできます。 

// C# Implicit call of base class default constructor
// Author: rajeshvs@msn.com
using System;
class Base
{
public Base()
{
Console.WriteLine("BASE 1");
}
public Base(int x)
{
Console.WriteLine("BASE 2");
}
}
class Derived : Base
{
public Derived():base(10)
{
Console.WriteLine("DERIVED CLASS");
}
}
class MyClient
{
public static void Main()
{
Derived d1 = new Derived();//Displays 'base constructor'
}
}

このプログラムは出力します

BASE2
DERIVED CLASS 

base()は、継承階層でコンストラクターをチェーンするために使用できます。

デストラクタ

.NET Frameworkには、未使用のオブジェクトが占有するメモリの割り当てを解除するためのガベージコレクションと呼ばれるメカニズムが組み込まれています。デストラクタは、ガベージコレクションプロセス中に実行されるステートメントを実装します。デストラクタは、クラスの名前と同じ名前で、文字〜で始まる関数です。

class Complex
{
public Complex()
{
// constructor
}
~Complex()
{
// Destructor
}
}

デストラクタはprivate、publicなどの修飾子を持つことができないことに注意してください。修飾子を使用してデストラクタを宣言すると、コンパイラはエラーを表示します。また、デストラクタは引数なしで1つの形式でのみ表示されます。C#にはパラメーター化されたデストラクタはありません。 

デストラクタは自動的に呼び出され、明示的に呼び出すことはできません。オブジェクトがプログラムのアクティブな部分で使用されなくなると、オブジェクトはガベージコレクションの対象になります。デストラクタの実行は、インスタンスまたはオブジェクトが破棄の対象になった後、いつでも発生する可能性があります。 

C#では、すべてのクラスがスーパーベースクラスオブジェクトから暗黙的に派生します。オブジェクトクラスには、すべてのクラスがオーバーライドできる1つの特別なメソッドFinalize()が含まれています。.NETのガベージコレクションメカニズムは、このクラスのオブジェクトのガベージコレクションの前にこのメソッドを呼び出します。クラスにデストラクタを指定すると、コンパイル時にコンパイラが自動的にFinalize()メソッドを生成することに注意してください。つまり、デストラクタとオーバーライドされたFinalize()メソッドはクラス内で共存できません。上記のプログラムが原因で、次のコードはコンパイルエラーを生成します

class Complex
{
~Complex()
{
}
protected override void Finaliz()
{
}
}

リンク:https//www.c-sharpcorner.com/article/constructor-and-destructors-in-C-Sharp/

#csharp 

What is GEEK

Buddha Community

C#のコンストラクタとデストラクタ
坂本  健一

坂本 健一

1641533220

C#のコンストラクタとデストラクタ

オブジェクトが作成されるたびに、コードを自動的に実行する場合は、コンストラクターを使用できます。実行するコードはコンストラクターに配置する必要があります。C#コンストラクターの一般的な形式は次のとおりです 

修飾子constructor_name(パラメーター)
{
//コンストラクター本体
}

修飾子は、private、public、protected、internalのいずれかになります。コンストラクターの名前は、クラスが定義されているクラスの名前である必要があります。コンストラクターは、0個以上の引数を取ることができます。引数がゼロのコンストラクター(つまり、引数なし)は、デフォルトのコンストラクターと呼ばれます。コンストラクターの戻り型はないことに注意してください。 

次のクラスには、2つの引数を取るコンストラクターが含まれています。 

class Complex
{
private int x;
private int y;
public Complex (int i, int j)
{
x = i;
y = j;
}
public void ShowXY ()
{
Console.WriteLine(x + "i+" + y);
}
}

次のコードセグメントは、コマンドプロンプトに20 + i25を表示します。  

Complex c1 = new Complex (20,25);
c1.ShowXY (); // Displays 20+i25

つまり、Complexクラスのオブジェクトを作成すると、コンストラクターが自動的に呼び出され、そのデータメンバーxとyが初期化されます。コンストラクタは主にオブジェクトの初期化に使用されていると言えます。コンストラクター内で非常に複雑な計算を行うことも可能です。コンストラクター内のステートメントも例外をスローする可能性があります。 

クラスにコンストラクターを提供しない場合、C#は、クラスのオブジェクトを作成するための空の本体を持つデフォルトのコンストラクターを提供します。独自のコンストラクターを提供する場合、C#はデフォルトのコンストラクターを提供しないことに注意してください。 

完全なプログラムを以下に示します

// C# constructor example
// Author: rajeshvs@msn.com
using System;
class Complex
{
private int x;
private int y;
public Complex(int i, int j) // constructor with 2 arguments
{
x = i;
y = j;
}
public void ShowXY()
{
Console.WriteLine(x +"i+" + y);
}
}
class MyClient
{
public static void Main()
{
Complex c1 = new Complex(20,25);
c1.ShowXY();
}
}

コンストラクターのオーバーロード 

メンバー関数と同様に、コンストラクターもクラスでオーバーロードできます。オーバーロードされたコンストラクターは、引数の数および/または引数のタイプおよび/または引数の順序が異なる必要があります。 

次のプログラムは、オーバーロードされたコンストラクターの動作を示しています。 

// C# constructor overloading
// author: rajeshvs@msn.com
using System;
class Complex
{
public Complex(int i, int j)
{
Console.WriteLine("constructor with 2 integer arguemets");
}
public Complex(double i, double j)
{
Console.WriteLine("constructor with 2 double arguments");
}
public Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c1 = new Complex(20,25);// displays 'constructor with 2 integer arguments'
Complex c2 = new Complex(2.5,5.9); // displays 'constructor with 2 double arguments'
Complex c3 = new Complex(); displays 'no argument constructor'
}
}

プライベートコンストラクター

C#では、コンストラクターをパブリック、プライベート、プロテクト、または内部として宣言できることはすでに見てきました。クラスがプライベートコンストラクタのみを宣言する場合、他のクラスがこのクラスから派生したり、このクラスのインスタンスを作成したりすることはできません。プライベートコンストラクターは、静的メンバーのみを含むクラスで一般的に使用されます。ただし、クラスにはプライベートコンストラクタとパブリックコンストラクタの両方を含めることができ、そのようなクラスのオブジェクトも作成できますが、プライベートコンストラクタを使用することはできません。

以下はC#で有効なプログラムです 

// C# constructor both private & public
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex(int i, int j)
{
Console.WriteLine("constructor with 2 integer arguments");
}
public Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c3 = new Complex();
}
}

ただし、次のプログラムにはプライベートコンストラクタのみが含まれているため、コンパイルされません。 

// C# constructor only private. Will show compilation error.
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex()
{
Console.WriteLine("no argument constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c3 = new Complex();
}
}
public void Method1()
{
Console.WriteLine("Method of a non-abstract class");
}
}

コンストラクター連鎖

上記のプログラム全体は、C#がコンストラクターのオーバーロードをサポートしていることを示しています。C#では、1つのコンストラクターでも、同じクラスまたはこのクラスの基本クラスで別のコンストラクターを呼び出すことができます。これは、コンストラクターチェーンと呼ばれるものです。コンストラクターチェーンには、次のように特別なタイプの構文が使用されます。 

// C# constructor chaining
// Author: rajeshvs@msn.com
using System;
class Complex
{
private Complex()
{
Console.Write("1");
}
private Complex(int x):this()
{
Console.Write("2");
}
public Complex(int x, int y):this(10)
{
Console.Write("3");
}
}
class MyClient
{
public static void Main()
{
Complex c = new Complex(10,20); // Displays 123
}
}

上記のプログラムでは、Complex(int x、int y)は、特別な構文 ':' this(arguments)を使用して、Complex(int x)コンストラクターを呼び出します。これにより、Complex()コンストラクターが呼び出されます。

静的コンストラクター 

これまで説明してきた通常のコンストラクターは、静的メンバーと非静的メンバーの両方の初期化に使用できます。ただし、C#は、クラスが最初にロードされるときに静的データメンバーを初期化するために、静的コンストラクターと呼ばれる特別なタイプのコンストラクターを提供します。他の静的メンバー関数と同様に、静的コンストラクターは非静的データメンバーに直接アクセスできないことに注意してください。 

静的コンストラクターの名前はクラスの名前である必要があり、それらにも戻り型はありません。キーワードstaticは、静的コンストラクターを通常のコンストラクターと区別するために使用されます。静的コンストラクターは引数を取ることができません。つまり、引数のない静的コンストラクターの形式は1つだけです。他の方法では、静的コンストラクターをオーバーロードすることはできません。

静的コンストラクターと一緒にアクセス修飾子を使用することはできません。 

例えば

// C# static constructor
// Author: rajeshvs@msn.com
using System;
class Complex
{
static Complex()
{
Console.WriteLine("static constructor");
}
}
class MyClient
{
public static void Main()
{
Complex c;
Console.WriteLine("RAJESH");
c = new Complex();
}
}

上記のプログラムの出力は次のとおりです。

RAJESH
static constructor 

静的コンストラクターは、クラスが最初にロードされるときに呼び出されることに注意してください。ただし、静的コンストラクターの実行の正確な時間と順序を予測することはできません。これらは、クラスのインスタンスが作成される前、静的メンバーが呼び出される前、および派生クラスの静的コンストラクターが呼び出される前に呼び出されます。 

非静的コンストラクターと同様に、静的コンストラクターを相互に、または他の非静的コンストラクターとチェーンすることはできません。基本クラスの静的コンストラクターは、派生クラスに継承されません。 

コンストラクターと継承 

静的コンストラクターと非静的コンストラクターはどちらも、基本クラスから派生クラスに継承されません。ただし、派生クラスの非静的コンストラクターは、特殊関数base()を使用して、基本クラスの非静的コンストラクターを呼び出すことができます。派生クラスから基本クラスのデフォルトコンストラクターとパラメーター化コンストラクターの両方を呼び出すことができます。基本クラスコンストラクターを明示的に呼び出さない場合、派生クラスコンストラクターは、派生クラスのオブジェクトが作成されるときに、基本クラスのデフォルトコンストラクターを暗黙的に呼び出します。これは、以下のプログラムに示されています。 

// C# Implicit call of base class default constructor
// Author: rajeshvs@msn.com
using System;
class Base
{
public Base()
{
Console.WriteLine("base constructor");
}
}
class Derived : Base
{
}
class MyClient
{
public static void Main()
{
Derived d1 = new Derived();//Displays 'base constructor'
}
}

以下に示すように、base()を使用して、基本クラスのコンストラクターを明示的に呼び出すこともできます。 

// C# Implicit call of base class default constructor
// Author: rajeshvs@msn.com
using System;
class Base
{
public Base()
{
Console.WriteLine("BASE 1");
}
public Base(int x)
{
Console.WriteLine("BASE 2");
}
}
class Derived : Base
{
public Derived():base(10)
{
Console.WriteLine("DERIVED CLASS");
}
}
class MyClient
{
public static void Main()
{
Derived d1 = new Derived();//Displays 'base constructor'
}
}

このプログラムは出力します

BASE2
DERIVED CLASS 

base()は、継承階層でコンストラクターをチェーンするために使用できます。

デストラクタ

.NET Frameworkには、未使用のオブジェクトが占有するメモリの割り当てを解除するためのガベージコレクションと呼ばれるメカニズムが組み込まれています。デストラクタは、ガベージコレクションプロセス中に実行されるステートメントを実装します。デストラクタは、クラスの名前と同じ名前で、文字〜で始まる関数です。

class Complex
{
public Complex()
{
// constructor
}
~Complex()
{
// Destructor
}
}

デストラクタはprivate、publicなどの修飾子を持つことができないことに注意してください。修飾子を使用してデストラクタを宣言すると、コンパイラはエラーを表示します。また、デストラクタは引数なしで1つの形式でのみ表示されます。C#にはパラメーター化されたデストラクタはありません。 

デストラクタは自動的に呼び出され、明示的に呼び出すことはできません。オブジェクトがプログラムのアクティブな部分で使用されなくなると、オブジェクトはガベージコレクションの対象になります。デストラクタの実行は、インスタンスまたはオブジェクトが破棄の対象になった後、いつでも発生する可能性があります。 

C#では、すべてのクラスがスーパーベースクラスオブジェクトから暗黙的に派生します。オブジェクトクラスには、すべてのクラスがオーバーライドできる1つの特別なメソッドFinalize()が含まれています。.NETのガベージコレクションメカニズムは、このクラスのオブジェクトのガベージコレクションの前にこのメソッドを呼び出します。クラスにデストラクタを指定すると、コンパイル時にコンパイラが自動的にFinalize()メソッドを生成することに注意してください。つまり、デストラクタとオーバーライドされたFinalize()メソッドはクラス内で共存できません。上記のプログラムが原因で、次のコードはコンパイルエラーを生成します

class Complex
{
~Complex()
{
}
protected override void Finaliz()
{
}
}

リンク:https//www.c-sharpcorner.com/article/constructor-and-destructors-in-C-Sharp/

#csharp