クラス (C# プログラミング ガイド)
クラスとは、他の型、メソッド、およびイベントの変数と共にグループ化することで独自のカスタム型を作成できる構成要素です。クラスは設計図に似ています。型のデータと動作を定義します。クラスが静的として宣言されていない場合、クライアント コードでは、オブジェクトまたはインスタンスを作成して変数に割り当てることでクラスを使用できます。変数は、その変数への参照がすべてスコープ外になるまで、メモリ内に保持されます。このとき、CLR により、ガベージ コレクションの対象となるようにマークされます。クラスが静的として宣言されている場合、メモリ内には 1 つのコピーだけが存在し、クライアント コードはインスタンス変数ではなくクラス自体を介してそのコピーにアクセスします。詳細については、「静的クラスと静的クラス メンバー (C# プログラミング ガイド)」を参照してください。
構造体とは異なり、クラスでは、オブジェクト指向プログラミングの基本的な特性である継承がサポートされます。詳細については、「継承 (C# プログラミング ガイド)」を参照してください。
クラスの宣言
クラスは、次の例に示すように、class キーワードを使用して宣言します。
public class Customer
{
//Fields, properties, methods and events go here...
}
class キーワードは、アクセス レベルの後に配置します。この例では、public が使用されているため、だれもがこのクラスからオブジェクトを作成できます。class キーワードの後にクラス名を記述します。定義の残りの部分がクラス本体で、そこで動作とデータを定義します。クラスのフィールド、プロパティ、メソッド、およびイベントはクラス メンバーと総称されます。
オブジェクトの作成
クラスとオブジェクトは、同義的に使用されることがありますが、これらは異なるものです。クラスはオブジェクトの型を定義しますが、オブジェクト自体ではありません。オブジェクトは、クラスに基づく具体的なエンティティであり、クラスのインスタンスと呼ばれることもあります。
オブジェクトを作成するには、次のように、new キーワードの後にオブジェクトの基になるクラスの名前を指定します。
Customer object1 = new Customer();
クラスのインスタンスを作成すると、そのオブジェクトへの参照が返されます。前の例の object1 は、Customer に基づくオブジェクトへの参照です。この参照は、新しいオブジェクトを参照しますが、オブジェクト データ自体を含みません。実際、オブジェクト参照は、オブジェクトを作成しなくても作成できます。次に例を示します。
Customer object2;
上のような、オブジェクトを参照しないオブジェクト参照を作成するのはお勧めできません。実行時にこのような参照を通じてオブジェクトへのアクセスを試みると失敗するからです。ただし、新しいオブジェクトを作成するか、既存のオブジェクトに割り当てると、このような参照でオブジェクトを参照できるようになります。次に例を示します。
Customer object3 = new Customer();
Customer object4 = object3;
上のコードでは、同じオブジェクトを共に参照する 2 つのオブジェクトが作成されます。そのため、object3 を通じて行われたオブジェクトの変更は、その後、object4 を使用する際にも反映されます。これは、クラスに基づくオブジェクトが参照によって参照されるからです。このためクラスは参照型と呼ばれています。
クラスの継承
継承は、派生を使用して行われます。派生とは、データと動作の継承元である基本クラスを使用してクラスを宣言することを意味します。基本クラスは、派生クラス名の後に、コロンと基本クラス名を追加して指定します。次に例を示します。
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
クラスで基本クラスを宣言している場合、基本クラスのすべてのメンバー (コンストラクター以外) が継承されます。
C++ とは異なり、C# のクラスは 1 つの基本クラスから直接継承することしかできません。ただし、基本クラス自体が別のクラスを継承している場合があるため、1 つのクラスに複数の基本クラスが間接的に継承されることもあります。さらに、クラスは 1 つ以上のインターフェイスを直接実装できます。詳細については、「インターフェイス (C# プログラミング ガイド)」を参照してください。
クラスは抽象としても宣言できます。抽象クラスには、シグネチャ定義が存在し、実装は存在しない抽象メソッドが含まれます。抽象クラスはインスタンス化できません。抽象クラスを使用するには、抽象メソッドを実装する派生クラスを介する必要があります。これとは対照的に、シール クラスは、他のクラスに派生させることはできません。詳細については、「抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)」を参照してください。
クラス定義は、別々のソース ファイルに分割できます。詳細については、「部分クラスと部分メソッド (C# プログラミング ガイド)」を参照してください。
説明
次の例では、フィールド、メソッド、およびコンストラクターという特殊なメソッドをそれぞれ 1 つずつ含むパブリック クラスを定義しています。詳細については、「コンストラクター (C# プログラミング ガイド)」を参照してください。このクラスは、new キーワードによってインスタンス化されています。
使用例
public class Person
{
// Field
public string name;
// Constructor that takes no arguments.
public Person()
{
name = "unknown";
}
// Constructor that takes one argument.
public Person(string nm)
{
name = nm;
}
// Method
public void SetName(string newName)
{
name = newName;
}
}
class TestPerson
{
static void Main()
{
// Call the constructor that has no parameters.
Person person1 = new Person();
Console.WriteLine(person1.name);
person1.SetName("John Smith");
Console.WriteLine(person1.name);
// Call the constructor that has one parameter.
Person person2 = new Person("Sarah Jones");
Console.WriteLine(person2.name);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output:
// unknown
// John Smith
// Sarah Jones
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。