C# では、型 (クラス、構造体、またはレコード) の定義は、型が実行できる内容を指定するブループリントに似ています。 オブジェクトは基本的に、ブループリントに従って割り当てられ、構成されたメモリのブロックです。 この記事では、これらのブループリントとその機能の概要について説明します。 このシリーズの次の記事では、オブジェクトについて説明します。
カプセル化
カプセル化 は、オブジェクト指向プログラミングの最初の柱または原則と呼ばれることもあります。 クラスまたは構造体は、クラスまたは構造体の外部のコードに対する各メンバーへのアクセス方法を指定できます。 クラスまたはアセンブリの外部のコンシューマーを対象としていないメンバーは、コーディング エラーや悪意のある悪用の可能性を制限するために非表示になります。 詳細については、 オブジェクト指向プログラミング チュートリアルを参照してください。
メンバー
型の メンバー には、すべてのメソッド、フィールド、定数、プロパティ、およびイベントが含まれます。 C# では、他の言語に存在するグローバル変数やメソッドはありません。 プログラムのエントリ ポイントである Main
メソッドも、クラスまたは構造体内で宣言する必要があります ( 最上位レベルのステートメントを使用する場合は暗黙的に)。
次の一覧には、クラス、構造体、またはレコードで宣言できるさまざまな種類のメンバーがすべて含まれています。
- 田畑
- 定数
- 特性
- メソッド
- コンストラクター
- イベント
- ファイナライザー
- インデクサー
- オペレーター
- 入れ子にされた型
詳細については、「 メンバー」を参照してください。
アクセシビリティ
一部のメソッドとプロパティは、 クライアント コードと呼ばれるクラスまたは構造体の外部のコードから呼び出したり、コードからアクセスしたりするためのものです。 その他のメソッドとプロパティは、クラスまたは構造体自体でのみ使用できます。 目的のクライアント コードのみがアクセスできるように、コードのアクセシビリティを制限することが重要です。 次のアクセス修飾子を使用して、型とそのメンバーがクライアント コードにどのようにアクセスできるかを指定します。
既定のアクセシビリティは private
です。
継承
クラス (構造体ではなく) では、継承の概念がサポートされます。 基底クラスと呼ばれる別のクラスから派生したクラスには、 コンストラクターとファイナライザーを除き、基底クラスのすべてのパブリック メンバー、プロテクト メンバー、および内部メンバーが自動的に含まれます。
クラスは 抽象として宣言できます。つまり、1 つ以上のメソッドに実装はありません。 抽象クラスは直接インスタンス化することはできませんが、不足している実装を提供する他のクラスの基底クラスとして機能できます。 クラスを シール として宣言して、他のクラスがクラスから継承されないようにすることもできます。
詳細については、「 継承 と ポリモーフィズム」を参照してください。
インターフェイス
クラス、構造体、およびレコードは、複数のインターフェイスを実装できます。 インターフェイスから実装するには、型がインターフェイスで定義されているすべてのメソッドを実装することを意味します。 詳細については、「 インターフェイス」を参照してください。
ジェネリック型
クラス、構造体、およびレコードは、1 つ以上の型パラメーターを使用して定義できます。 クライアント コードは、型のインスタンスを作成するときに型を提供します。 たとえば、List<T>名前空間のSystem.Collections.Generic クラスは、1 つの型パラメーターで定義されます。 クライアント コードは、リストが保持する型を指定する List<string>
または List<int>
のインスタンスを作成します。 詳細については、「 ジェネリック」を参照してください。
静的な型
クラス (構造体やレコードではない) は、 static
として宣言できます。 静的クラスには静的メンバーのみを含めることができるので、 new
キーワードを使用してインスタンス化することはできません。 プログラムが読み込まれると、クラスの 1 つのコピーがメモリに読み込まれ、そのメンバーはクラス名を介してアクセスされます。 クラス、構造体、およびレコードには、静的メンバーを含めることができます。 詳細については、「 静的クラスと静的クラス メンバー」を参照してください。
入れ子にされた型
クラス、構造体、またはレコードは、別のクラス、構造体、またはレコード内に入れ子にすることができます。 詳細については、入れ子型を参照してください。
部分型
クラス、構造体、またはメソッドの一部は、別のコード ファイル内の 1 つのコード ファイルと別の部分で定義できます。 詳細については、「 部分クラスとメソッド」を参照してください。
オブジェクト初期化子
クラスまたは構造体オブジェクト、およびオブジェクトのコレクションをインスタンス化して初期化するには、そのプロパティに値を割り当てます。 詳細については、「 オブジェクト初期化子を使用してオブジェクトを初期化する方法」を参照してください。
匿名型
名前付きクラスを作成するのが便利ではない場合や必要な場合は、匿名型を使用します。 名前付きデータ メンバーは匿名型を定義します。 詳細については、「 匿名型」を参照してください。
拡張メンバー
別の型を作成することで、派生クラスを作成せずにクラスを "拡張" できます。 その型には、元の型に属しているかのように呼び出すことができるメソッドが含まれています。 詳細については、「 拡張メソッド」を参照してください。
暗黙的に型指定されるローカル変数
クラスまたは構造体メソッド内では、暗黙的な型指定を使用して、コンパイル時に変数の型を決定するようにコンパイラに指示できます。 詳細については、 var (C# リファレンス) を参照してください。
レコード
クラスまたは構造体に record
修飾子を追加できます。 レコードは、値ベースの等価性に対する組み込みの動作を持つ型です。 レコード ( record class
または record struct
) には、次の機能があります。
- 変更できないプロパティを使用して参照型を作成するための簡潔な構文。
- 値の等価性。 レコード型の 2 つの変数は、同じ型を持つ場合は等しく、すべてのフィールドに対して両方のレコードの値が等しい場合は等しくなります。 クラスは参照等価性を使用します。クラス型の 2 つの変数は、同じオブジェクトを参照する場合は等しくなります。
- 非破壊的変異の簡潔な構文。
with
式を使用すると、既存のインスタンスのコピーであるが、指定したプロパティ値が変更された新しいレコード インスタンスを作成できます。 - 表示用の組み込みの書式設定。
ToString
メソッドは、レコード型の名前と、パブリック プロパティの名前と値を出力します。 - レコード クラスでの継承階層のサポート。 レコード クラスは継承をサポートします。 レコード構造体は継承をサポートしていません。
詳細については、「 レコード」を参照してください。
C# 言語仕様
詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
.NET