静的クラスおよび静的クラスメンバー(C#)


静的クラス
静的クラスは非静的クラスとほぼ同じですが、静的クラスはインスタンス化できません.すなわち,newキーワードを用いて静的クラスタイプの変数を作成することはできない.インスタンス変数がないため、クラス名自体を使用して静的クラスのメンバーにアクセスします.たとえば、UtilityClassという名前の静的クラスにMethodAという共通メソッドがある場合は、次の例で呼び出されます.
C#: UtilityClass.MethodA();
静的クラスの主な特性:
  • には静的メンバーのみが含まれます.
  • はインスタンス化できません.
  • は密封されています.
  • にはインスタンスコンストラクション関数は含まれません.

  • したがって、静的クラスの作成は、静的メンバーとプライベートコンストラクタのみを含むクラスの作成と基本的に同じです.プライベートコンストラクション関数は、クラスがインスタンス化されることを阻止します.静的クラスを使用する利点は、コンパイラがインスタンスメンバーを偶然追加しないようにチェックを実行できることです.コンパイラは、このようなインスタンスを作成しないことを保証します.
    静的クラスは密封されているため、継承できません.これらはObject以外のクラスから継承できません.静的クラスにはインスタンスコンストラクション関数は含まれませんが、静的コンストラクション関数を含めることができます.非静的クラスに重要な初期化が必要な静的メンバーが含まれている場合は、静的構造関数も定義します.せいてきこうぞうかんすう

    次に、摂氏温度と華氏温度の間で往復変換を行う2つの方法を含む静的クラスの例を示します.
    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. */

    静的クラスメンバー
    非静的クラスには、静的メソッド、フィールド、プロパティ、またはイベントが含まれます.クラスのインスタンスが作成されていなくても、クラスの静的メンバーを呼び出すことができます.静的メンバーには、インスタンス名ではなくクラス名で常にアクセスします.クラスに複数のインスタンスを作成しても、静的メンバーには1つのコピーしかありません.
    静的メソッドおよびプロパティは、タイプに含まれる非静的フィールドおよびイベントにアクセスできず、メソッドパラメータで明示的に渡されない限り、オブジェクトのインスタンス変数にアクセスできません.
    より一般的な方法は、クラス全体を静的クラスとして宣言するのではなく、静的メンバーを持つ非静的クラスを宣言することです.静的フィールドには、インスタンス化されたオブジェクトの数を記録する方法と、すべてのインスタンス間で共有する必要がある値を格納する方法の2つが一般的です.
    静的メソッドは、クラスに属し、クラスのインスタンスに属していないため、リロードできますが、書き換えることはできません.
    フィールドはstatic constと宣言できませんが、constフィールドの動作は本質的に静的です.このようなフィールドはタイプに属し、タイプのインスタンスには属しません.したがって、constフィールドにアクセスするには、静的フィールドと同様にClassName.MemberName表現を使用します.オブジェクトインスタンスは必要ありません.
    C#は静的ローカル変数(メソッド範囲内で宣言された変数)をサポートしません.
    次の例では、staticキーを使用して、メンバーの戻りタイプの前に静的クラスメンバーを宣言します.
    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...
    }

    静的メンバーは、最初にアクセスされる前に、静的構造関数(存在する場合)を呼び出す前に初期化されます.静的クラスメンバーにアクセスするには、次の例に示すように、変数名ではなくクラス名を使用してメンバーの場所を指定します.
    Automobile.Drive();
    int i = Automobile.NumberOfWheels;

    クラスに静的フィールドが含まれている場合は、クラスのロード時にこれらのフィールドを初期化する静的構造関数を指定します.
    参考資料
    静的クラスおよび静的クラスメンバー(C#プログラミングガイド):https://msdn.microsoft.com/zh-cn/library/79b3xss3(v=vs.120).aspx