クラスと構造体 (C# プログラミング ガイド)

更新 : 2008 年 7 月

クラスと構造体は、.NET Framework の共通型システムの 2 つの基本構成です。クラスと構造体は、どちらも基本的にはデータと動作のセットを 1 つの論理単位としてカプセル化するデータ構造です。データと動作はクラスまたは構造体のメンバです。このトピックで後述するように、メソッド、プロパティ、イベントなどが含まれます。

クラスまたは構造体の宣言は、実行時にインスタンスやオブジェクトを作成するために使用する設計図のようなものです。Person というクラスまたは構造体を定義すると、Person は型の名前になります。型 Person の変数 p を宣言して初期化すると、p は Person のオブジェクトまたはインスタンスになります。同じ Person 型のインスタンスを複数作成し、各インスタンスのプロパティとフィールドに異なる値を設定することができます。

クラスは参照型です。クラスのオブジェクトが作成されると、オブジェクトが割り当てられている変数にはそのメモリへの参照だけが設定されます。オブジェクト参照が新しい変数に割り当てられると、新しい変数は元のオブジェクトを参照します。いずれの変数も同じデータを参照しているため、1 つの変数に加えられた変更は他の変数にも反映されます。

構造体は値の型です。構造体が作成されると、構造体が割り当てられている変数にはその構造体の実際のデータが設定されます。構造体が新しい変数に割り当てられると、そのデータがコピーされます。したがって、新しい変数と元の変数には、同じデータのコピーが別個に含まれることになります。一方のコピーに対して行われた変更は、もう一方のコピーには影響しません。

一般に、クラスは、より複雑な動作、つまりクラス オブジェクトの作成後に変更されることを意図されたデータをモデル化するために使用されます。構造体は、主として構造体の作成後に変更されることを意図しないデータを含む、小規模なデータ構造に最適です。

詳細については、「クラス (C# プログラミング ガイド)」、「オブジェクト (C# プログラミング ガイド)」、および「構造体 (C# プログラミング ガイド)」を参照してください。

使用例

次の例では、3 つのメンバを含む MyCustomClass が ProgrammingGuide 名前空間の最上位に定義されます。MyCustomClass のインスタンス (オブジェクト) は Program クラスの Main メソッドで作成され、オブジェクトのメソッドとプロパティにはドット表記を使用してアクセスします。

namespace ProgrammingGuide
{
    // Class definition.
    public class MyCustomClass
    {
        // Class members:
        // Property.
        public int Number { get; set; }

        // Method.
        public int Multiply(int num)
        {
            return num * Number;
        }

        // Instance Constructor.
        public MyCustomClass()
        {
            Number = 0;
        }
    }
    // Another class definition. This one contains
    // the Main method, the entry point for the program.
    class Program
    {
        static void Main(string[] args)
        {
            // Create an object of type MyCustomClass.
            MyCustomClass myClass = new MyCustomClass();

            // Set the value of a public property.
            myClass.Number = 27;

            // Call a public method.
            int result = myClass.Multiply(4);
        }
    }
}

カプセル化

カプセル化は、オブジェクト指向プログラミングの原理と言われることもあります。カプセル化の原理に基づくと、クラスまたは構造体は、クラスや構造体の外部のコードに対してメンバがアクセスする方法を指定できます。クラスやアセンブリの外部からの使用を意図されていないメソッドや変数は非表示にして、コーディング エラーや悪意のある攻略が生じる潜在性を軽減できます。

クラスの詳細については、「クラス (C# プログラミング ガイド)」および「オブジェクト (C# プログラミング ガイド)」を参照してください。クラスを設計する方法の詳細については、「型のデザインのガイドライン」を参照してください。

メンバ (C# プログラミング ガイド)

すべてのメソッド、フィールド、定数、プロパティ、およびイベントは型で宣言する必要があります。これらは、クラスまたは構造体のメンバと呼ばれます。C# にはグローバル変数やグローバル メソッドはありません (言語によっては、グローバル変数やグローバル メソッドが存在する場合もあります)。プログラムのエントリ ポイントである Main メソッドでも、クラスまたは構造体で宣言する必要があります。クラスまたは構造体で宣言できるすべてのメンバを次に示します。

アクセシビリティ

メソッドやプロパティの中には、クラスまたは構造体の外部にあるコード (クライアント コードと呼ばれます) から呼び出されたりアクセスされたりするように用意されているものがあります。その他のメソッドやプロパティは、クラスまたは構造体それ自体でのみ使用されるようになっています。意図したクライアント コードだけがアクセスできるように、コードのアクセシビリティを制限することが重要です。型やメンバがクライアント コードにアクセスする方法を指定するには、アクセス修飾子 publicprotectedinternal、protected internal、および private を使用します。既定のアクセシビリティは private です。詳細については、「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。

継承

クラスでは、継承の概念がサポートされます (構造体ではサポートされません)。他のクラス (基本クラス) から派生するクラスには、コンストラクタとデストラクタを除く基本クラスのすべてのパブリック メンバ、プロテクト メンバ、および内部メンバが自動的に含まれます。詳細については、「継承 (C# プログラミング ガイド)」および「ポリモーフィズム (C# プログラミング ガイド)」を参照してください。

クラスは、abstract として宣言することもできます。このようなクラスは、1 つ以上のメソッドの実装を持っていないことを意味します。抽象クラスを直接インスタンス化することはできませんが、他のクラスの基本クラスとして抽象クラスを使用し、不足している実装を提供することができます。また、クラスを sealed として宣言して、他のクラスがそのクラスを継承しないようにすることもできます。詳細については、「抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)」を参照してください。

インターフェイス

クラスと構造体は、複数のインターフェイスを継承できます。インターフェイスの継承は、そのインターフェイスで定義されたすべてのメソッドを型が実装することを意味します。詳細については、「インターフェイス (C# プログラミング ガイド)」を参照してください。

ジェネリック型

クラスと構造体は、1 つ以上の型パラメータを指定して定義できます。クライアント コードでは、型のインスタンスの作成時に型を指定します。たとえば、System.Collections.Generic 名前空間の List<T> クラスは、1 つの型パラメータを指定して定義されています。クライアント コードでは、List<string> または List<int> のインスタンスを作成して、リストに保持する型を指定します。詳細については、「ジェネリック (C# プログラミング ガイド)」を参照してください。

静的な型

クラス (構造体ではありません) は、static として宣言できます。静的クラスには含めることができるのは静的メンバだけであり、静的クラスを new キーワードでインスタンス化することはできません。プログラムが読み込まれると、クラスの 1 つのコピーがメモリに読み込まれます。そのメンバには、クラス名を使用してアクセスします。クラスと構造体は、いずれも静的メンバを含むことができます。詳細については、「静的クラスと静的クラス メンバ (C# プログラミング ガイド)」を参照してください。

入れ子にされた型

クラスまたは構造体は、他のクラスまたは構造体内で入れ子にすることができます。詳細については、「入れ子にされた型」を参照してください。

部分型

あるコード ファイルにクラス、構造体、またはメソッドの一部を定義して、別のコード ファイルに他の部分を定義することができます。詳細については、「部分クラスと部分メソッド」を参照してください。

オブジェクト初期化子

明示的にコンストラクタを呼び出さずに、クラス オブジェクトまたは構造体オブジェクト、およびオブジェクトのコレクションのインスタンス化と初期化を行うことができます。詳細については、「オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド)」を参照してください。

匿名型

永続的に保持したり他のメソッドに渡したりする必要のないデータ構造体のリストを作成する場合など、名前付きクラスを作成することが適さない状況または不要な状況では、匿名型を使用します。詳細については、「匿名型 (C# プログラミング ガイド)」を参照してください。

拡張メソッド

別の型を作成し、元の型に属しているかのようにそのメソッドを呼び出せるようにすることで、派生クラスを作成せずにクラスを "拡張" できます。詳細については、「拡張メソッド (C# プログラミング ガイド)」を参照してください。

暗黙的に型指定されるローカル変数

クラス メソッドや構造体メソッド内では、暗黙の型指定を使用して、コンパイル時に適切な型を判断するようにコンパイラに指示できます。詳細については、「暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)」を参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

  • 1.6 クラスとオブジェクト

  • 1.7 構造体

  • 3.4.4 クラスのメンバ

  • 4.2.1 クラス型

  • 10 クラス

  • 11 構造体

参照

概念

C# プログラミング ガイド

履歴の変更

日付

履歴

理由

2008 年 7 月

概要に情報と定義を追加

情報の拡充

2008 年 7 月

アクセシビリティに関する情報を追加

情報の拡充