constructor.Destructor
クラス内に変数などがある場合、インスタンスを生成してから変数を利用するまでの間に、
適切な値を初期値として設定したい場合がある。
POINT
コンストラクタは
インスタンスが生成された瞬間に実行されるメソッドのひとつ。
コンストラクタの名前は、クラス名と一致させねばならない。
コンストラクタは暗黙のうちに実行されるため、戻り値は存在しない。
newによって生成された時点で自動的に呼び出されている。
コンストラクタもオーバーロード可能なので
引数の異なる複数のコンストラクタを1つのクラスに持たせることができる
共通の初期化コードなどがあった場合、このような仕様は不便である。
“: this(…)”により
別のコンストラクタを呼び出すコンストラクタを使用する。
class Class2
{
public Class2()
{
Console.WriteLine("public Class2() called");
}
// このコンストラクタの実行に先立って同じクラス内で引数なしのコンストラクタを実行してね ^ ^/ という意味.
public Class2( int x ) : this()
{
Console.WriteLine("public Class2( int x ) called");
}
public Class2( string s ) : this(1)
{
Console.WriteLine("public Class2( string s ) called");
}
}
class ClassBase
{
public int x1,y1;
// base の Ctor
public ClassBase( int x, int y )
{
x1 = x;
y1 = y;
}
}
class ClassDelived : ClassBase
{
public int x2,y2;
// 継承元を呼び出す
public ClassDelived( int x, int y ) : base( x+1, y+1 )
{
x2 = x;
y2 = y;
}
}
メンバ変数の初期化
クラス内のメンバ変数に初期値を入れるだけなら、コンストラクタを使うのではなく、
直接初期値を指定できる。
クラスが生成されるときにその値が自動的に代入される。
public class Test {
// x の初期値を 1 にする。
public int x = 1;
public static void Main() {
Test t;
Console.WriteLine( t.x );
}
}
POINT
コンストラクタは メンバ変数の初期値が設定された後に実行される。
// x = 1 の初期化の後に実行される。
Test() {
// x = 1 から 10 に変更する。
x = 10;
}
private.Constructor
POINT
private な Ctor は new を封印する.( 逆に public を忘れずに. )
private なコンストラクタ
結論を先取りすると、コンストラクタは外部からいっさい呼び出し不可能になる。
、new を使ったインスタンスの生成がいっさい不可能になるというのに等しい。
staticなメソッドだけを提供するクラスを作ったとしよう
このクラスのインスタンスを生成することは無意味である
だが、勘違いしたプログラマが
インスタンスを生成しようと試みるかもしれない
class Class2
{
private Class2() {}
//
}
static なコンストラクタ
C#には、staticなメソッドやメンバ変数が存在するが、
コンストラクタにもstaticなものが存在する。staticなコンストラクタは、
そのクラスのインスタンスが生成されたり
staticメソッドなどが呼び出されたりする前に自動的に呼び出されるコンストラクタである
ただし、いつ呼び出されるかは厳密に規定されていないので
プログラムの実行開始時に呼び出されるという保証はない。
staticなメソッドやstaticなメンバ変数をいろいろ活用するとき、
事前にメンバ変数を初期化したいときに便利な機能
インスタンスを生成していないため呼ばれないはずのコンストラクタだが、
static を指定することによりそれが実行されているのが分かる。
class Class2
{
// static な Ctor
staticなコンストラクタには、publicやprivateのようなアクセス制御キーワードは付けない。
これは暗黙のうちに実行する以外の選択肢がないので、
それを明示的にコントロールする意味がないためだ。
static Class2()
{
Console.WriteLine("static Class2() called");
}
static public void special()
{
Console.WriteLine("static public special() called");
}
}