概要
機能別索引&概要。 C# で使える型とそのメンバーの一覧を先に示しておきます。
型
大まかに分類すると以下の通り。
| 組み込み型 | ユーザー定義型 | 他の型から合成する型 | |
|---|---|---|---|
| 値型 | 単純型 |
構造体 |
Null 許容型 |
| 参照型 | 文字列型 |
クラス |
配列 |
| その他 | ポインター |
縦軸分類
値型: 値をスタックに確保。代入時にはコピーが作られる。継承不可。
参照型: 値をヒープに確保。代入時には参照を渡すだけ。
参考: 「値型と参照型」「[雑記] スタックとヒープ」
横軸分類
組み込み型: プログラミング言語にあらかじめ組み込まれている変数の型 →「組込み型」
ユーザー定義型: プログラマーが自由に作ることができる型(後述)
他の型から合成する型: ある型
TからT[]やT?などというような書き方で「合成」して作る型(後述)
ユーザー定義型
| 型 | 説明 |
|---|---|
クラス |
いわゆる複合型。 最も基本的なユーザー定義型 →「クラス」 |
構造体 |
同じく、複合型。 クラスとの違いは値型であること →「値型と参照型」 |
インターフェイス |
抽象メンバーだけを持つ(要するに、型の規約(contract)だけを定める)型 →「インターフェース」 |
列挙型 |
特定の値だけを取ることができる型 →「列挙型」 |
デリゲート |
いわゆる fist-class 関数。 メソッドを参照するための型 →「デリゲート」 |
クラスとインターフェイスと構造体の3つは非常によく似ていて、いずれも次節「クラス、インターフェイス、構造体のメンバー」で説明する「メンバー」を持てます。 違いは以下の通りです。
クラスは参照型で、構造体は値型になります(参考:「値型と参照型」)。
構造体は継承(参考:「継承」)ができません
インターフェイスはデータ メンバーを持てず、関数メンバーも実装を持てません(全て abstract(参考:「抽象メソッド、抽象クラス」)扱い)
クラスは多重継承できませんが、インターフェイスなら複数継承(実装)することができます。
他の型から合成する型
| 型 | 説明 |
|---|---|
配列 |
複数のデータをひとまとめにして扱うための型 →「配列」 |
Null 許容型 |
値型でも null(無効な値)を認めたい場合に使います →「Nullable 型」 |
ポインター |
C# では、基本的にポインター(メモリのアドレスを数値として扱う)を禁止していますが、 unsafe コンテキスト内でのみポインターを利用可能です →「unsafe」 |
クラス、インターフェイス、構造体のメンバー
データ メンバー
データを表すメンバー。
| メンバー | 説明 |
|---|---|
フィールド |
|
定数 |
ユーザー定義型に関連付けられた定数 →「定数」 |
インターフェイスはデータ メンバーを持てません。
関数メンバー
何らかの処理を行うメンバー。
| メンバー | 説明 |
|---|---|
メソッド |
普通に関数らしい使い方をする関数メンバー →「関数」 |
コンストラクター |
初期化処理 →「コンストラクター」 |
ファイナライザー |
破棄処理 →「ファイナライザー」 |
プロパティ |
いわゆるアクセサーを構文化したもの。 クラス外からはフィールド的に、 クラス内からはメソッド的に使える/作れるメンバー →「プロパティ」 |
インデクサー |
一種の「引数付きプロパティ」。 配列のように、インデックスを指定して要素を読み書きするためのメンバー →「インデクサー」 |
イベント |
いわゆるオブザーバー パターンを構文化したもの。 イベント ハンドラーの登録口を自動生成します →「イベント」 |
演算子 |
ユーザー定義型向けに演算子をオーバーロードできます →「演算子のオーバーロード」 |
このうち、ファイナライザーはクラスのみ、コンストラクターと演算子はクラスと構造体(インターフェイス以外)のみで定義できます。
特殊なメソッド
メソッドに関しては、いくつか特殊な機能を持つものもあります。
| メソッド | 説明 |
|---|---|
イテレーター ブロック |
データの列挙(IEnumerable の実装)を簡素化します →「イテレーター」 |
拡張メソッド |
既存の型に後からメソッドを追加(したかのように見せかけます)。静的メソッドをインスタンス メソッドと同様の構文で呼び出せるようにします →「拡張メソッド」 |
部分メソッド |
開発ツールとの連携用 →「クラスの分割定義」 |
非同期メソッド |
非同期処理を簡素化します →「非同期メソッド」 |
メンバーのアクセス レベル
メンバーにアクセス可能な範囲を制御するためのアクセス修飾子。
| アクセス修飾子 | 説明 |
|---|---|
public |
どこからでもアクセス可能。 |
protected |
その型、もしくは、派生クラス内からのみアクセス可能 (ファミリー スコープ(family scope))。 |
internal |
アセンブリ内からのみアクセス可能 (アセンブリ スコープ(assembly scope))。 |
protected internal |
protected または internal。 その型、派生クラス、もしくは、アセンブリ内からのみアクセス可能。 |
private protected |
protected かつ internal。 その型、アセンブリ内にある派生クラスからのみアクセス可能。 |
private |
その型の中からのみアクセス可能。 |
クラスなどの型は、名前空間直下やグローバル スコープ中で定義できますが、 この場合、public もしくは internal のみが指定可能です。 この場合、アクセス修飾子を省略すると internal 扱いになります。
クラス内では全てのアクセス修飾子が利用可能です。 この場合、省略すると private 扱いになります。
