概要
機能別索引&概要。 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 扱いになります。