静的クラスと静的クラス メンバー (C# プログラミング ガイド)Static Classes and Static Class Members (C# Programming Guide)

静的クラスは基本的には非静的クラスと同じですが、静的クラスはインスタンス化できないという点が異なります。A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. つまり、new キーワードを使用して、そのクラス型の変数を作成することはできません。In other words, you cannot use the new keyword to create a variable of the class type. インスタンス変数がないため、静的クラスのメンバーにアクセスするには、クラス名自体を使用します。Because there is no instance variable, you access the members of a static class by using the class name itself. たとえば、UtilityClass という静的クラスがあり、MethodA というパブリック メソッドが定義されている場合、このメソッドを呼び出すには次の例のようにします。For example, if you have a static class that is named UtilityClass that has a public method named MethodA, you call the method as shown in the following example:

UtilityClass.MethodA();  

静的クラスは、入力パラメーターに対してのみ処理を行い、内部のインスタンス フィールドを取得したり設定したりする必要のない一連のメソッドを格納する、便利なコンテナーとして使用できます。A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields. たとえば、.NET Framework クラス ライブラリでは、静的クラス System.Math に、数値演算を実行するメソッドが含まれており、Math クラスの特定のインスタンスに固有のデータを格納または取得する必要はありません。For example, in the .NET Framework Class Library, the static System.Math class contains methods that perform mathematical operations, without any requirement to store or retrieve data that is unique to a particular instance of the Math class. つまり、次の例に示すように、クラス名とメソッド名を指定して、クラスのメンバーを適用します。That is, you apply the members of the class by specifying the class name and the method name, as shown in the following example.

double dub = -3.14;  
Console.WriteLine(Math.Abs(dub));  
Console.WriteLine(Math.Floor(dub));  
Console.WriteLine(Math.Round(Math.Abs(dub)));  

// Output:  
// 3.14  
// -4  
// 3  

すべてのクラス型の場合と同様に、静的クラスの型情報は、.NET Framework.NET Framework の共通言語ランタイム (CLR) によって、そのクラスを参照しているプログラムが読み込まれるときに読み込まれます。As is the case with all class types, the type information for a static class is loaded by the .NET Framework.NET Framework common language runtime (CLR) when the program that references the class is loaded. プログラムでは、クラスが読み込まれるタイミングを正確に指定することはできません。The program cannot specify exactly when the class is loaded. ただし、クラスがプログラム内で最初に参照される前に、そのクラスが読み込まれ、そのフィールドが初期化され、その静的コンストラクターが呼び出されることが保証されます。However, it is guaranteed to be loaded and to have its fields initialized and its static constructor called before the class is referenced for the first time in your program. 静的コンストラクターは一度だけ呼び出され、静的クラスは、プログラムが存在するアプリケーション ドメインの有効期間にわたってメモリに保持されます。A static constructor is only called one time, and a static class remains in memory for the lifetime of the application domain in which your program resides.

注意

インスタンスの作成を 1 つしか許可しない非静的クラスを作成する場合は、「C# でのシングルトンの実装」を参照してください。To create a non-static class that allows only one instance of itself to be created, see Implementing Singleton in C#.

静的クラスの主な特徴を以下に示します。The following list provides the main features of a static class:

したがって、静的クラスを作成することと、静的メンバーとプライベート コンストラクターのみを含むクラスを作成することは、基本的に同じです。Creating a static class is therefore basically the same as creating a class that contains only static members and a private constructor. プライベート コンストラクターは、クラスのインスタンス化を防ぎます。A private constructor prevents the class from being instantiated. 静的クラスを使用する利点は、インスタンス メンバーが誤って追加されないことをコンパイラで確認できるという点です。The advantage of using a static class is that the compiler can check to make sure that no instance members are accidentally added. コンパイラによって、このクラスのインスタンスを作成できないことが保証されます。The compiler will guarantee that instances of this class cannot be created.

静的クラスはシールされるため、継承できません。Static classes are sealed and therefore cannot be inherited. Object 以外のクラスから継承することはできません。They cannot inherit from any class except Object. 静的クラスにインスタンス コンストラクターを含めることはできませんが、静的コンストラクターを含めることはできます。Static classes cannot contain an instance constructor; however, they can contain a static constructor. 特別な初期化を必要とする静的メンバーがクラスに含まれている場合は、非静的クラスであっても静的コンストラクターを定義する必要があります。Non-static classes should also define a static constructor if the class contains static members that require non-trivial initialization. 詳細については、「静的コンストラクター」を参照してください。For more information, see Static Constructors.

Example

次に、摂氏と華氏の間で温度を変換する 2 つのメソッドを含む静的クラスの例を示します。Here is an example of a static class that contains two methods that convert temperature from Celsius to Fahrenheit and from Fahrenheit to Celsius:

public static class TemperatureConverter
{
    public static double CelsiusToFahrenheit(string temperatureCelsius)
    {
        // Convert argument to double for calculations.
        double celsius = Double.Parse(temperatureCelsius);

        // Convert Celsius to Fahrenheit.
        double fahrenheit = (celsius * 9 / 5) + 32;

        return fahrenheit;
    }

    public static double FahrenheitToCelsius(string temperatureFahrenheit)
    {
        // Convert argument to double for calculations.
        double fahrenheit = Double.Parse(temperatureFahrenheit);

        // Convert Fahrenheit to Celsius.
        double celsius = (fahrenheit - 32) * 5 / 9;

        return celsius;
    }
}

class TestTemperatureConverter
{
    static void Main()
    {
        Console.WriteLine("Please select the convertor direction");
        Console.WriteLine("1. From Celsius to Fahrenheit.");
        Console.WriteLine("2. From Fahrenheit to Celsius.");
        Console.Write(":");

        string selection = Console.ReadLine();
        double F, C = 0;

        switch (selection)
        {
            case "1":
                Console.Write("Please enter the Celsius temperature: ");
                F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());
                Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
                break;

            case "2":
                Console.Write("Please enter the Fahrenheit temperature: ");
                C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());
                Console.WriteLine("Temperature in Celsius: {0:F2}", C);
                break;

            default:
                Console.WriteLine("Please select a convertor.");
                break;
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Example Output:
    Please select the convertor direction
    1. From Celsius to Fahrenheit.
    2. From Fahrenheit to Celsius.
    :2
    Please enter the Fahrenheit temperature: 20
    Temperature in Celsius: -6.67
    Press any key to exit.
 */

静的メンバーStatic Members

非静的クラスには、静的メソッド、フィールド、プロパティ、またはイベントを含めることができます。A non-static class can contain static methods, fields, properties, or events. 静的メンバーは、クラスのインスタンスが作成されていない場合でも、クラスで呼び出すことです。The static member is callable on a class even when no instance of the class has been created. 静的メンバーには、必ずインスタンス名ではなくクラス名でアクセスします。The static member is always accessed by the class name, not the instance name. クラスのインスタンスの作成数に関係なく、静的メンバーのコピーは 1 つしか存在しません。Only one copy of a static member exists, regardless of how many instances of the class are created. 静的メソッドと静的プロパティは、それを含んでいる型の非静的フィールドや非静的イベントにはアクセスできません。また、メソッド パラメーターに明示的に渡されない限り、どのオブジェクトのインスタンス変数にもアクセスできません。Static methods and properties cannot access non-static fields and events in their containing type, and they cannot access an instance variable of any object unless it is explicitly passed in a method parameter.

クラス全体を静的として宣言するよりも、非静的クラスを宣言して、いくつかの静的メンバーを含める方が一般的です。It is more typical to declare a non-static class with some static members, than to declare an entire class as static. 静的フィールドの一般的な用途として、インスタンス化されたオブジェクトの数を保持することと、すべてのインスタンスで共有する必要のある値を格納することの 2 つがあります。Two common uses of static fields are to keep a count of the number of objects that have been instantiated, or to store a value that must be shared among all instances.

静的メソッドのオーバーロードはできますが、オーバーライドはできません。これは、静的メソッドがクラスのインスタンスではなくクラスに属しているためです。Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

フィールドを static const として宣言することはできませんが、const フィールドは、その動作において本質的に静的です。Although a field cannot be declared as static const, a const field is essentially static in its behavior. これは、型のインスタンスではなく、型に属します。It belongs to the type, not to instances of the type. そのため、const フィールドにアクセスするには、静的フィールドに対して使用するのと同じ ClassName.MemberName 表記法を使用します。Therefore, const fields can be accessed by using the same ClassName.MemberName notation that is used for static fields. オブジェクト インスタンスは必要ありません。No object instance is required.

C# では、静的なローカル変数 (メソッドのスコープで宣言された変数) はサポートされません。C# does not support static local variables (variables that are declared in method scope).

静的クラスのメンバーを宣言するには、次の例に示すように、メンバーの戻り値の型の前で static キーワードを使用します。You declare static class members by using the static keyword before the return type of the member, as shown in the following example:

public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { }
    public static event EventType RunOutOfGas;

    // Other non-static fields and properties...
}

静的メンバーは初めてアクセスされる前に初期化されます。また、静的コンストラクターがある場合は、それが呼び出される前に初期化されます。Static members are initialized before the static member is accessed for the first time and before the static constructor, if there is one, is called. 静的クラスのメンバーにアクセスするには、次の例に示すように、変数名の代わりにクラス名を使用してメンバーの位置を指定します。To access a static class member, use the name of the class instead of a variable name to specify the location of the member, as shown in the following example:

Automobile.Drive();
int i = Automobile.NumberOfWheels;

クラスに静的フィールドが含まれている場合は、クラスが読み込まれたときに静的フィールドを初期化する静的コンストラクターを用意します。If your class contains static fields, provide a static constructor that initializes them when the class is loaded.

静的メソッドの呼び出しでは、Microsoft Intermediate Language (MSIL) の call 命令が生成されます。これに対して、インスタンス メソッドの呼び出しでは callvirt 命令が生成され、null オブジェクト参照もチェックされます。A call to a static method generates a call instruction in Microsoft intermediate language (MSIL), whereas a call to an instance method generates a callvirt instruction, which also checks for a null object references. ただし、ほとんどの場合、2 つの間にパフォーマンス上の違いはそれほどありません。However, most of the time the performance difference between the two is not significant.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目See Also

C# プログラミング ガイドC# Programming Guide
staticstatic
クラスClasses
classclass
静的コンストラクターStatic Constructors
インスタンス コンストラクターInstance Constructors