みんな、ありがとう。しばらく研究に費やした後、誰かを助けるかもしれないいくつかのポイントを追加したいと思います。
免責事項:(以下の点は、codeprojectおよび他のそのようなWebサイトから導き出された(または貼り付けられた)ものです。
1)すべてのクラスは静的コンストラクターを1つだけ持つことができます。
理由:静的コンストラクターはパラメーターなしである必要があります。または単純に、コンストラクターのオーバーロードは許可されていません。また、CLRはこのコンストラクターを呼び出すため、この関数に値を渡すことを制御することはできません。静的コンストラクターを直接呼び出すことはできないため、複数の静的コンストラクターを使用しても意味がありません。
class Test
{
static Test() {...}
static Test(int a) {...} //would throw error as "Static constructor must be parameter less"
}
2)静的コンストラクターは、アクセス指定子なしで宣言する必要があります。
理由:ここでも、CLRはクラスのオブジェクトではなく静的コンストラクターを呼び出します。したがって、アクセス指定子は必要ありません。
3)静的コンストラクターは、そのクラスの静的変数に対してのみ動作する必要があります
理由:非静的メンバーはオブジェクトインスタンスに固有です。値が特定のオブジェクトインスタンスに依存/バインドする変数を変更しても意味がありません。
4)静的コンストラクターを使用する必要があるのはなぜですか?良い例を1つ挙げてください
理由:静的コンストラクターを使用できます。たとえば、そのクラスを使用して実行する操作をログに記録する場合などです。MSDNによると、「静的コンストラクターの一般的な使用法は、クラスがログファイルを使用していて、コンストラクターを使用してこのファイルにエントリを書き込む場合です」とのことです。
5)静的コンストラクターが正確に呼び出されるのはいつですか?
回答:ユーザーは、静的コンストラクターがプログラムでいつ実行されるかを制御できません。他の人やMSDNが指摘しているように、「最初のインスタンスが作成される前、または静的メンバーが参照される前に、静的コンストラクターが自動的に呼び出されてクラスが初期化されます。」
6)C#で基本クラスと派生クラスを使用する場合、派生クラスの新しいインスタンスが作成されると、基本クラスコンストラクターが最初に呼び出されますか、それとも派生クラスコンストラクターが最初に呼び出されますか?
回答:基本クラスのコンストラクターが最初に呼び出され、次に派生クラスのコンストラクターが呼び出されます。
コード例
class DerivedClass : ParentClass
{
public DerivedClass()
{
Console.WriteLine("Derived class constructor!");
}
}
class ParentClass
{
public ParentClass()
{
System.Console.WriteLine("Parent class constructor!");
}
}
class Program
{
static void Main(string[] args)
{
var a = new DerivedClass(); //Implicitly Typed local variables.
}
}
7)上記の例で、両方のコンストラクターにパブリックアクセス指定子があるのはなぜですか?privateを指定するか、アクセス指定子をまったく指定しない場合はどうなりますか?
回答:アクセス指定子を指定しない場合(この場合、コンストラクターは自動的にプライベートになります)、またはプライベートアクセス指定子を使用する場合は常に、クラスをインスタンス化できません。クラスに1つ以上のプライベートコンストラクタが含まれている場合は常に、厳密に(!)インスタンス化することはできません。このタイプのコンストラクターは特殊インスタンスコンストラクターと呼ばれ、通常、クラスのすべてのメンバーが静的メソッドである場合に使用されます。(おそらく、Mathクラスが良い例になるはずです。)
** 8)相続に関するボーナス質問。クラスは2つの異なるクラスから継承しますか?
厳密にはいいえ。C#は直接継承のみをサポートし、もちろんインターフェイスを使用できます。たとえば、
interface Test
{
void abc();
}
class DerivedClass : ParentClass, Test //Test should not be a class. It can be a interface.
{
public DerivedClass()
{
Console.WriteLine("Derived class constructor!");
}
public void abc()
{
//should be publicly defined!
//non public method could not implement from interface Test
}
}
class ParentClass
{
public ParentClass()
{
System.Console.WriteLine("Parent class constructor!");
}
}