C#[4]

2018/08/02

C#メモ

ref/out

C#のメソッドの引数で渡された値や参照は通常コピーされてメソッド内で使用される。そのため、メソッド内で引数に対して操作した内容はメソッド外のスコープに反映されない。
ポインタのようにメソッド内で引数に対する参照を渡し、操作したい場合はref修飾子を使用する。
refを使用する場合は、必ず参照に値が代入されている必要がある。しかし、メソッド引数に結果を表す変数(isOpenなど)を渡し、メソッドの実行結果を確認したい場合がある。このような引数は実行前には状態が確定しないため、初期化されていない。
この場合はout修飾子を使用する。

オーバーロード

戻り値の型が異なるだけでは不十分

同一引数を持ち、戻り値の型が異なるメソッドはオーバーロードはみなせない。

暗黙的な型変換

byte型、short型はint型に昇格される。 float型はdouble型に昇格される。 ただし、byte, short, floatを引数にとるオーバーロードメソッドが定義されている場合、そのメソッドが適用される。

void Test(int a) {

}

static void Main() {
    byte b = 10;
    Test(b); //byteがintに昇格される。
}

ref/outはオバーロードの対象か?

下記オーバーロードは可能

void Test(int a)
void Test(ref int a)

下記オーバーロードは無効

void Test(ref int a)
void Test(out int a)

静的メソッド

静的メソッドはインスタンスメソッドを呼び出すことはできない。静的メソッドは特定のインスタンスに紐づくものではないため。

静的メソッドはstaticなデータのみにアクセスできる。これも上記同様、静的メソッドは特定のインスタンスに紐づく処理ではないため。

静的コンストラクター

クラスがロードされた際に自動的に呼び出される。