クラスと構造体 (C# プログラミング ガイド)Classes and Structs (C# Programming Guide)

クラスと構造体は、.NET Framework の共通型システムの 2 つの基本構成です。Classes and structs are two of the basic constructs of the common type system in the .NET Framework. クラスと構造体は、どちらも基本的にはデータと動作のセットを 1 つの論理単位としてカプセル化するデータ構造です。Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. データと動作はクラスまたは構造体の "メンバー" です。このトピックで後述するように、メソッド、プロパティ、イベントなどが含まれます。The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

クラスまたは構造体の宣言は、実行時にインスタンスやオブジェクトを作成するために使用する設計図のようなものです。A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Person というクラスまたは構造体を定義すると、Person は型の名前になります。If you define a class or struct called Person, Person is the name of the type. p の変数 Person を宣言して初期化すると、pPerson のオブジェクトまたはインスタンスになります。If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. 同じ Person 型のインスタンスを複数作成し、各インスタンスのプロパティとフィールドに異なる値を設定することができます。Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

クラスは参照型です。A class is a reference type. クラスのオブジェクトが作成されると、オブジェクトが割り当てられている変数にはそのメモリへの参照だけが設定されます。When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. オブジェクト参照が新しい変数に割り当てられると、新しい変数は元のオブジェクトを参照します。When the object reference is assigned to a new variable, the new variable refers to the original object. いずれの変数も同じデータを参照しているため、1 つの変数に加えられた変更は他の変数にも反映されます。Changes made through one variable are reflected in the other variable because they both refer to the same data.

構造体は値の型です。A struct is a value type. 構造体が作成されると、構造体が割り当てられている変数にはその構造体の実際のデータが設定されます。When a struct is created, the variable to which the struct is assigned holds the struct's actual data. 構造体が新しい変数に割り当てられると、そのデータがコピーされます。When the struct is assigned to a new variable, it is copied. したがって、新しい変数と元の変数には、同じデータのコピーが別個に含まれることになります。The new variable and the original variable therefore contain two separate copies of the same data. 一方のコピーに対して行われた変更は、もう一方のコピーには影響しません。Changes made to one copy do not affect the other copy.

一般に、クラスは、より複雑な動作、つまりクラス オブジェクトの作成後に変更されることを意図されたデータをモデル化するために使用されます。In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. 構造体は、主として構造体の作成後に変更されることを意図しないデータを含む、小規模なデータ構造に最適です。Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

詳細については、「クラス」、「オブジェクト」、および「構造体」を参照してください。For more information, see Classes, Objects, and Structs.

Example

次の例では、ProgrammingGuide 名前空間の CustomClass に 3 つのメンバー (インスタンス コンストラクター、Number という名前のプロパティ、Multiply という名前のメソッド) があります。In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. Program クラスの Main メソッドによって CustomClass のインスタンス (オブジェクト) が作成され、オブジェクトのメソッドとプロパティにはドット表記を使用してアクセスします。The Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

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

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

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

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

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

カプセル化Encapsulation

"カプセル化" は、オブジェクト指向プログラミングの原理と言われることもあります。Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. カプセル化の原理に基づくと、クラスまたは構造体は、クラスや構造体の外部のコードに対してメンバーがアクセスする方法を指定できます。According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. クラスやアセンブリの外部からの使用を意図されていないメソッドや変数は非表示にして、コーディング エラーや悪意のある攻略が生じる潜在性を軽減できます。Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

クラスの詳細については、「クラス」および「オブジェクト」を参照してください。For more information about classes, see Classes and Objects.

メンバーMembers

すべてのメソッド、フィールド、定数、プロパティ、およびイベントは型で宣言する必要があります。これらは、型のメンバーと呼ばれます。All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. C# にはグローバル変数やグローバル メソッドはありません (言語によっては、グローバル変数やグローバル メソッドが存在する場合もあります)。In C#, there are no global variables or methods as there are in some other languages. プログラムのエントリ ポイントである Main メソッドでも、クラスまたは構造体で宣言する必要があります。Even a program's entry point, the Main method, must be declared within a class or struct. クラスまたは構造体で宣言できるすべてのメンバーを次に示します。The following list includes all the various kinds of members that may be declared in a class or struct.

ユーザー補助Accessibility

メソッドやプロパティの中には、クラスまたは構造体の外部にあるコード ("クライアント コード" と呼ばれます) から呼び出されたりアクセスされたりするように用意されているものがあります。Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. その他のメソッドやプロパティは、クラスまたは構造体それ自体でのみ使用されるようになっています。Other methods and properties might be only for use in the class or struct itself. 意図したクライアント コードだけがアクセスできるように、コードのアクセシビリティを制限することが重要です。It is important to limit the accessibility of your code so that only the intended client code can reach it. 型やメンバーがクライアント コードにアクセスする方法を指定するには、アクセス修飾子 publicprotectedinternalprotected internalprivate、および private protected を使用します。You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. 既定のアクセシビリティは private です。The default accessibility is private. 詳細については、「アクセス修飾子」を参照してください。For more information, see Access Modifiers.

継承Inheritance

クラスでは、継承の概念がサポートされます (構造体ではサポートされません)。Classes (but not structs) support the concept of inheritance. 他のクラス (基底クラス) から派生するクラスには、コンストラクターとファイナライザーを除く基底クラスのすべてのパブリック メンバー、プロテクト メンバー、および内部メンバーが自動的に含まれます。A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. 詳細については、「継承」および「ポリモーフィズム」を参照してください。For more information, see Inheritance and Polymorphism.

クラスは、abstract として宣言することもできます。このようなクラスは、1 つ以上のメソッドの実装を持っていないことを意味します。Classes may be declared as abstract, which means that one or more of their methods have no implementation. 抽象クラスを直接インスタンス化することはできませんが、他のクラスの基底クラスとして抽象クラスを使用し、不足している実装を提供することができます。Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. また、クラスを sealed として宣言して、他のクラスがそのクラスを継承しないようにすることもできます。Classes can also be declared as sealed to prevent other classes from inheriting from them. 詳細については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。For more information, see Abstract and Sealed Classes and Class Members.

インターフェイスInterfaces

クラスと構造体は、複数のインターフェイスを継承できます。Classes and structs can inherit multiple interfaces. インターフェイスの継承は、そのインターフェイスで定義されたすべてのメソッドを型が実装することを意味します。To inherit from an interface means that the type implements all the methods defined in the interface. 詳細については、「インターフェイス」を参照してください。For more information, see Interfaces.

ジェネリック型Generic Types

クラスと構造体は、1 つ以上の型パラメーターを指定して定義できます。Classes and structs can be defined with one or more type parameters. クライアント コードでは、型のインスタンスの作成時に型を指定します。Client code supplies the type when it creates an instance of the type. たとえば、List<T> 名前空間の System.Collections.Generic クラスは、1 つの型パラメーターを指定して定義されています。For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. クライアント コードでは、List<string> または List<int> のインスタンスを作成して、リストに保持する型を指定します。Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. 詳細については、「ジェネリック」を参照してください。For more information, see Generics.

静的な型Static Types

クラス (構造体ではありません) は、static として宣言できます。Classes (but not structs) can be declared as static. 静的クラスには含めることができるのは静的メンバーだけであり、静的クラスを new キーワードでインスタンス化することはできません。A static class can contain only static members and cannot be instantiated with the new keyword. プログラムが読み込まれると、クラスの 1 つのコピーがメモリに読み込まれます。そのメンバーには、クラス名を使用してアクセスします。One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. クラスと構造体は、いずれも静的メンバーを含むことができます。Both classes and structs can contain static members. 詳細については、「静的クラスと静的クラス メンバー」を参照してください。For more information, see Static Classes and Static Class Members.

入れ子にされた型Nested Types

クラスまたは構造体は、他のクラスまたは構造体内で入れ子にすることができます。A class or struct can be nested within another class or struct. 詳細については、「入れ子にされた型」を参照してください。For more information, see Nested Types.

部分型Partial Types

あるコード ファイルにクラス、構造体、またはメソッドの一部を定義して、別のコード ファイルに他の部分を定義することができます。You can define part of a class, struct or method in one code file and another part in a separate code file. 詳細については、「部分クラスと部分メソッド」を参照してください。For more information, see Partial Classes and Methods.

オブジェクト初期化子Object Initializers

明示的にコンストラクターを呼び出さずに、クラス オブジェクトまたは構造体オブジェクト、およびオブジェクトのコレクションのインスタンス化と初期化を行うことができます。You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. 詳細については、「オブジェクト初期化子とコレクション初期化子」を参照してください。For more information, see Object and Collection Initializers.

匿名型Anonymous Types

永続的に保持したり他のメソッドに渡したりする必要のないデータ構造体のリストを作成する場合など、名前付きクラスを作成することが適さない状況または不要な状況では、匿名型を使用します。In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. 詳細については、「匿名型」を参照してください。For more information, see Anonymous Types.

拡張メソッドExtension Methods

別の型を作成し、元の型に属しているかのようにそのメソッドを呼び出せるようにすることで、派生クラスを作成せずにクラスを "拡張" できます。You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. 詳細については、「拡張メソッド」を参照してください。For more information, see Extension Methods.

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

クラス メソッドや構造体メソッド内では、暗黙の型指定を使用して、コンパイル時に適切な型を判断するようにコンパイラに指示できます。Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. 詳細については、「暗黙的に型指定されるローカル変数」を参照してください。For more information, see Implicitly Typed Local Variables.

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