C# には 3 種類のコンストラクターがあります。
- インスタンスコンストラクター。
- 静的コンストラクター。
- プライベートコンストラクター。
1. インスタンスコンストラクター
コンストラクターは、クラス内の特別なメンバー関数であり、そのクラスと同じ名前を持ち、戻り値を持ちません。 new キーワードを使用してクラスのオブジェクトを作成する場合、インスタンス コンストラクターを使用してクラス内のメンバー プロパティを作成および初期化できます。次の例は、Person という名前のクラスと、クラス内のインスタンス コンストラクターを示しています。
public class Person{
private string name;
private int age;
public Person(string n, int a)
{
name = n;
age = a;
}
// このクラスの残りのメンバー
}
Person クラスのオブジェクトが作成されると、クラス内のインスタンス コンストラクターが呼び出されます。以下に示すように、オブジェクトをインスタンス化するときに、クラス内のコンストラクターに特定の値を渡すだけで済みます。
Person P = new Person(“Yamada”, 18);
クラスに対してコンストラクターが明示的に作成されていない場合、C# はこのクラスに対してパラメーターなしのコンストラクター (パラメーターなしコンストラクター) を暗黙的に作成します。C# の member 属性の既定値を設定します (C# の型の既定値については、次を参照してください)。 「データの種類」セクションへ)。構造体にも同様のことが当てはまり、構造体にコンストラクターが作成されない場合、C# は引数のないコンストラクターを暗黙的に作成して、各フィールドをデフォルト値に初期化します。
静的クラスまたは非静的クラスの静的プロパティを初期化するには、以下で説明する静的コンストラクターを使用する必要があります。
2. 静的コンストラクター
静的コンストラクターは、クラス内の静的データを初期化するため、または 1 回だけ実行する必要がある特定の操作を実行するために使用されます。静的コンストラクターは、最初のインスタンスが作成される前、またはクラス内の静的メンバーが参照される前に、自動的に呼び出されます。
静的コンストラクターには次のプロパティがあります。
- 静的コンストラクターはアクセス修飾子を使用しないか、パラメーターを持ちません。
- クラスまたは構造体には静的コンストラクターは 1 つだけ存在できます。
- 静的コンストラクターは継承またはオーバーロードできません。
- 静的コンストラクターは直接呼び出すことはできず、共通言語ランタイム (CLR) によってのみ呼び出されます。
- ユーザーはプログラム内の静的コンストラクターの実行時間を制御できません。
- 静的コンストラクターは、最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。
- 静的コンストラクターはインスタンス コンストラクターの前に実行されます。
【例】以下はインスタンスコンストラクターと静的コンストラクターを示す例です。
using System;
namespace it-kiso.com
{
class Demo
{
public static int num = 0;
// コンストラクター
Demo(){
num = 1;
}
// 静的コンストラクター
static Demo(){
num = 2;
}
static void Main(string[] args)
{
Console.WriteLine("num = {0}", num);
Demo Obj = new Demo();
Console.WriteLine("num = {0}", num);
Console.Read();
}
}
}
上記のプログラムを実行すると、最初にpublic static int num = 0
が実行され、次にクラス内の static コンストラクターが実行され、このとき num = 2 となり、Main 関数の内容が実行されます。このとき、num の値は 2 として出力され、Demo クラスが初期化され、この時点でクラス内のコンストラクターが実行され、この時点で num は 1 に再割り当てされます。上記の例は次のとおりです。
num = 2
num = 1
プライベート コンストラクターは特別な種類のインスタンス コンストラクターであり、通常は静的メンバーのみを含むクラスで使用されます。クラスに 1 つ以上のプライベート コンストラクターがあり、パブリック コンストラクターがない場合、他のクラス (ネストされたクラスを除く) はそのクラスのインスタンスを作成できません。例えば:
class NLog
{
// プライベートコンストラクター
private NLog() { }
public static double e = Math.E; //2.71828...
}
上記の例では、空のプライベート コンストラクターが定義されていますが、これを定義する利点は、空のコンストラクターによってパラメーターのないコンストラクターの自動生成が防止されることです。コンストラクターでアクセス修飾子が使用されていない場合、デフォルトでプライベート コンストラクターが使用されることに注意してください。
[例] 以下では例を使用してプライベート コンストラクターの使用方法を示します。
using System;
namespace it-kiso.com
{
class Demo
{
static void Main(string[] args)
{
// Student stu = new Student();
Student.id = 101;
Student.name = "Yamada";
Student.Display();
Console.Read();
}
}
public class Student
{
private Student() { }
public static int id;
public static string name;
public static void Display()
{
Console.WriteLine("姓名:"+name+" ID:"+id);
}
}
}
操作の結果は次のようになります。
姓名:Yamada ID:101
上記のコードでは、Main 関数Student stu = new Student();
コメントがキャンセルされると、Student クラスのコンストラクターがプライベート静的関数であり、次の理由でアクセスできないため、プログラムが誤動作することに注意してください。その保護レベル。