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