クラスと構造体メモ.cs
[C#]
コンストラクタ
コンストラクタとは、クラス名と同名で、戻り値のないメソッド。シグネチャに戻り値型を指定すると、コンストラクタとはみなされないので注意。
引数のないコンストラクタは、特別にデフォルト・コンストラクタと呼ばれる。
コンストラクタにprivateを指定すると、そのコンストラクタは呼び出しできないので、newでインスタンスを作成できないコンストラクタとなる。
ところで、クラスのフィールドメンバのデフォルトアクセシビリティは、privateである。したがって、アクセシビリティを明示しないコンストラクタはprivateとなり、インスタンスを作成できない。
つまり、通常のコンストラクタにはprotected internal以上のアクセシビリティを明示しなければならない。
コンストラクタがひとつも明示的に定義されていないクラスは、コンパイラが何もしないデフォルト・コンストラクタを用意して、それが呼び出される。
ひとつでも引数のあるコンストラクタが明示的に定義されていると、コンパイラは暗黙のデフォルト・コンストラクタを作成しない。
その場合にデフォルト・コンストラクタが必要であれば、クラス作成者が明示的に用意する必要がある。
クラスの場合、暗黙に変数フィールドが初期化される。
その後、コンストラクタが呼び出される。コンストラクタの最初の文が、スーパークラスのコンストラクタの明示的な呼び出しでない場合、コンパイラはスーパークラスのデフォルト・コンストラクタを呼び出そうとする。
スーパークラスにデフォルト・コンストラクタが存在しなければ、コンパイル・エラーになる。
staticコンストラクタ
staticコンストラクタの存在意義は、フィールドのstaticな値を初期化するためだけ。
staticコンストラクタは、プログラム中で最初にstaticな値にアクセスが行われたときに呼び出される。
したがって、staticコンストラクタはユーザが呼び出す必要はない。というか、暗黙にprivateであるので、呼び出せない。
アクセス修飾子を指定する必要もない。
staticクラス
staticクラスはstaticメンバの入れ物としての役割。
クラスと構造体の違い
クラスは参照型。構造体は値型。参照型は実体はヒープに置かれ、実体への参照によってアクセスする。
構造体は、すべてが暗黙にsealed。つまり、継承できない。
また、引数のあるコンストラクタを定義できない。
アクセシビリティ
アクセシビリティが適用される範囲は2つある。
1. 名前空間
public: アセンブリの外から利用可能であることを示す。
internal: アセンブリ内からのみ利用可能であることを示す。
2. クラス内(つまりフィールド)
種類は、5種類。下記フィールドのアクセシビリティを参照。
クラスを超えてアクセスが可能かどうか、という分類。
名前空間のデフォルトのアクセシビリティはinternal。
フィールドのアクセシビリティ
フィールドは、デフォルトでprivate。
フィールドの取れるアクセシビリティは5種類。
public -> protected -> internal -> protected internal -> private。