クラス (C# プログラミング ガイド)Classes (C# Programming Guide)

参照型Reference types

class として定義された型は、参照型です。A type that is defined as a class is a reference type. 実行時には、参照型の変数を宣言すると、new 演算子を使用してクラスのインスタンスを明示的に作成するまで、変数には値 null が格納されています。または、次の例に示すように、別の場所で作成された可能性がある、互換性のある型のオブジェクトを代入することもできます。At run time, when you declare a variable of a reference type, the variable contains the value null until you explicitly create an instance of the class by using the new operator, or assign it an object of a compatible type that may have been created elsewhere, as shown in the following example:

//Declaring a object of type MyClass.
MyClass mc = new MyClass();

//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;

オブジェクトが作成されると、その特定のオブジェクトに対してマネージド ヒープ上で十分なメモリが割り当てられ、変数にはそのオブジェクトの場所への参照のみが格納されます。When the object is created, enough memory is allocated on the managed heap for that specific object, and the variable holds only a reference to the location of said object. マネージド ヒープを使用する型では、メモリの割り当て時と、CLR の自動メモリ管理機能 ("ガベージ コレクション") による再要求時の両方についてオーバーヘッドが発生します。Types on the managed heap require overhead both when they are allocated and when they are reclaimed by the automatic memory management functionality of the CLR, which is known as garbage collection. しかし、ガベージ コレクションも高度に最適化されるため、ほとんどのシナリオでは、パフォーマンス上の問題が発生することはありません。However, garbage collection is also highly optimized and in most scenarios, it does not create a performance issue. ガベージ コレクションの詳細については、「自動メモリ管理とガベージ コレクション」を参照してください。For more information about garbage collection, see Automatic memory management and garbage collection.

クラスの宣言Declaring Classes

クラスは、次の例に示すように、class キーワードと、その後に続ける一意の識別子を使用して宣言します。Classes are declared by using the class keyword followed by a unique identifier, as shown in the following example:

//[access modifier] - [class] - [identifier]
public class Customer
{
   // Fields, properties, methods and events go here...
}

class キーワードは、アクセス レベルの後に配置します。The class keyword is preceded by the access level. この例では、public が使用されているため、誰でもこのクラスのインスタンスを作成できます。Because public is used in this case, anyone can create instances of this class. class キーワードの後にクラスの名前を記述します。The name of the class follows the class keyword. クラスの名前を、有効な C# の識別子名にする必要があります。The name of the class must be a valid C# identifier name. 定義の残りの部分がクラス本体で、そこで動作とデータを定義します。The remainder of the definition is the class body, where the behavior and data are defined. クラスのフィールド、プロパティ、メソッド、およびイベントはクラス メンバーと総称されます。Fields, properties, methods, and events on a class are collectively referred to as class members.

オブジェクトの作成Creating objects

クラスとオブジェクトは、同義的に使用されることがありますが、これらは異なるものです。Although they are sometimes used interchangeably, a class and an object are different things. クラスはオブジェクトの型を定義しますが、オブジェクト自体ではありません。A class defines a type of object, but it is not an object itself. オブジェクトは、クラスに基づく具体的なエンティティであり、クラスのインスタンスと呼ばれることもあります。An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

オブジェクトを作成するには、次のように、new キーワードの後にオブジェクトの基になるクラスの名前を指定します。Objects can be created by using the new keyword followed by the name of the class that the object will be based on, like this:

Customer object1 = new Customer();

クラスのインスタンスを作成すると、そのオブジェクトへの参照が返されます。When an instance of a class is created, a reference to the object is passed back to the programmer. 前の例の object1 は、Customer に基づくオブジェクトへの参照です。In the previous example, object1 is a reference to an object that is based on Customer. この参照は、新しいオブジェクトを参照しますが、オブジェクト データ自体を含みません。This reference refers to the new object but does not contain the object data itself. 実際、オブジェクト参照は、オブジェクトを作成しなくても作成できます。In fact, you can create an object reference without creating an object at all:

 Customer object2;

上のような、オブジェクトを参照しないオブジェクト参照を作成するのはお勧めしません。実行時にこのような参照を通じてオブジェクトへのアクセスを試みると失敗するからです。We don't recommend creating object references such as this one that don't refer to an object because trying to access an object through such a reference will fail at run time. ただし、新しいオブジェクトを作成するか、既存のオブジェクトに割り当てると、このような参照でオブジェクトを参照できるようになります。次に例を示します。However, such a reference can be made to refer to an object, either by creating a new object, or by assigning it to an existing object, such as this:

Customer object3 = new Customer();
Customer object4 = object3;

上のコードでは、同じオブジェクトを参照する 2 つのオブジェクト参照が作成されます。This code creates two object references that both refer to the same object. そのため、object3 を通じて行われたオブジェクトの変更は、後で object4 を使用するときに反映されます。Therefore, any changes to the object made through object3 are reflected in subsequent uses of object4. これは、クラスに基づくオブジェクトが参照によって参照されるからです。このためクラスは参照型と呼ばれています。Because objects that are based on classes are referred to by reference, classes are known as reference types.

クラスの継承Class inheritance

クラスは、オブジェクト指向プログラミングの基本的な特性である "継承" を完全にサポートします。Classes fully support inheritance, a fundamental characteristic of object-oriented programming. クラスを作成するときは、sealed として定義されているものを除く、他のすべてのインターフェイスまたはクラスから継承できます。また、作成したクラスから他のクラスを継承し、クラスの仮想メソッドをオーバーライドすることもできます。When you create a class, you can inherit from any other interface or class that is not defined as sealed, and other classes can inherit from your class and override class virtual methods.

継承は、派生を使用して行われます。派生とは、データの動作の継承元である基底クラスを使用してクラスを宣言することを意味します。Inheritance is accomplished by using a derivation, which means a class is declared by using a base class from which it inherits data and behavior. 基底クラスは、派生クラス名の後に、コロンと基底クラス名を追加して指定します。次に例を示します。A base class is specified by appending a colon and the name of the base class following the derived class name, like this:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

クラスで基底クラスを宣言している場合、基底クラスのすべてのメンバー (コンストラクター以外) が継承されます。When a class declares a base class, it inherits all the members of the base class except the constructors. 詳細については、「継承」を参照してください。For more information, see Inheritance.

C++ と異なり、C# のクラスは 1 つの基底クラスから直接継承することしかできません。Unlike C++, a class in C# can only directly inherit from one base class. ただし、基底クラス自体が別のクラスを継承している場合があるため、1 つのクラスに複数の基底クラスが間接的に継承されることもあります。However, because a base class may itself inherit from another class, a class may indirectly inherit multiple base classes. さらに、クラスは複数のインターフェイスを直接実装できます。Furthermore, a class can directly implement more than one interface. 詳細については、「インターフェイス」を参照してください。For more information, see Interfaces.

クラスは抽象としても宣言できます。A class can be declared abstract. 抽象クラスには、シグネチャ定義が存在し、実装は存在しない抽象メソッドが含まれています。An abstract class contains abstract methods that have a signature definition but no implementation. 抽象クラスはインスタンス化できません。Abstract classes cannot be instantiated. 抽象クラスを使用するには、抽象メソッドを実装する派生クラスを介する必要があります。They can only be used through derived classes that implement the abstract methods. これとは対照的に、シール クラスは、他のクラスに派生させることはできません。By contrast, a sealed class does not allow other classes to derive from it. 詳細については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。For more information, see Abstract and Sealed Classes and Class Members.

クラス定義は、別々のソース ファイルに分割できます。Class definitions can be split between different source files. 詳細については、「部分クラスと部分メソッド」を参照してください。For more information, see Partial Classes and Methods.

Example

次の例では、自動実装プロパティ、メソッド、およびコンストラクターという特殊なメソッドをそれぞれ 1 つずつ含むパブリック クラスを定義しています。The following example defines a public class that contains an auto-implemented property, a method, and a special method called a constructor. 詳しくは、プロパティメソッド、およびコンス トラクターに関するトピックを参照してください。For more information, see Properties, Methods, and Constructors topics. このクラスのインスタンスは、new キーワードによってインスタンス化されます。The instances of the class are then instantiated with the new keyword.

using System;

public class Person
{
    // Constructor that takes no arguments:
    public Person()
    {
        Name = "unknown";
    }

    // Constructor that takes one argument:
    public Person(string name)
    {
        Name = name;
    }

    // Auto-implemented readonly property:
    public string Name { get; }

    // Method that overrides the base class (System.Object) implementation.
    public override string ToString()
    {
        return Name;
    }
}
class TestPerson
{
    static void Main()
    {
        // Call the constructor that has no parameters.
        var person1 = new Person();
        Console.WriteLine(person1.Name);

        // Call the constructor that has one parameter.
        var person2 = new Person("Sarah Jones");
        Console.WriteLine(person2.Name);
        // Get the string representation of the person2 instance.
        Console.WriteLine(person2);

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

参照See Also