C#の静的クラスと静的クラスメンバーの説明

C#プログラミング言語のstaticキーワードを使用すると、静的クラスと静的メンバーを定義できます。

静的クラスは、抽象的で封印されたクラスに似ています。静的クラスと非静的クラスの違いは、静的クラスをインスタンス化または継承できないことと、クラスのすべてのメンバーが本質的に静的であることです。クラスを静的として宣言するには、クラス宣言でstaticキーワードを使用してクラスをマークする必要があります。 

静的クラスまたはメンバーには動作がないため、静的クラスの継承を許可しても意味がありません。静的クラスは静的メンバーのみを持つことができます—静的クラスでインスタンスメンバー(メソッド、変数、プロパティなど)を宣言することはできません。静的クラスに静的コンストラクターを含めることはできますが、静的クラス内にインスタンスコンストラクターを含めることはできません。

C#で静的クラスを使用する場合

いつ静的クラスに行くべきですか?通常、ヘルパークラスまたはユーティリティクラスは、インスタンス化または継承する必要がなく、通常、再利用可能なメソッドとプロパティのコレクションが含まれているため、静的クラスとして実装できます。次のコードリストは、C#の静的クラスがどのように見えるかを示しています。

パブリック静的クラスFileLogger

    {{

        public static void Log(string message)

        {{

            //データをテキストファイルに記録する方法

        }

    }

C#で静的メソッドを使用する場合

静的メソッドは、呼び出されるクラスのインスタンスを必要としないメソッドです。クラス自体で呼び出すことができます。静的メソッドは静的クラスメンバーにのみアクセスできることに注意してください。静的クラスまたは非静的クラス内に静的メソッドを含めることができます。また、静的クラスまたは非静的クラスに静的コンストラクターを含めることができます。静的コンストラクターは、クラスの静的メンバーを初期化するために使用されます。クラスの静的コンストラクターは、クラスの静的メンバーに初めてアクセスしたときに呼び出されます。

なぜ静的メソッドを使用する必要があるのですか?これらは、非静的メソッド、つまりインスタンスメソッドよりも実行が少し高速です。その理由は、ランタイムがthisポインターを暗黙的なパラメーターとして非静的メソッドまたはインスタンスメソッドに渡すためです。非静的メソッドのcallvirt場合、メソッドが非仮想であっても、コンパイラーは命令を発行することに注意してください。メソッドを静的にすると、コンパイラは非仮想callサイトを発行し、インスタンスがnullかどうかの余分なチェックを排除します。これにより、パフォーマンス上の利点が得られる場合があります。

したがって、構築しているアプリケーションがパフォーマンスが重要なアプリケーションである場合は、コードで静的型とメソッドを使用する価値があるかもしれません。コードがそのようなタイプやメンバーに対して多数の呼び出しを行う場合、パフォーマンスの向上はかなりのものになる可能性があります。

次のコードスニペットは、静的メソッドがどのように見えるかを示しています。

public static void Log(string message)

        {{

             string filePath = @ "F:\ Log.txt";

            using(StreamWriter streamWriter = new StreamWriter(filePath、true))

            {{

                streamWriter.WriteLine(メッセージ);

                streamWriter.Close();

            }

        }

C#でクラスの静的メンバーを使用する方法

CLRは、システムメモリを、スタック、ヒープ、および高周波ヒープの3つの異なる領域に分割します。静的オブジェクトは、クラスのインスタンスを作成せずに直接アクセスできるため、アプリケーションの存続期間中、メモリ内に存在する必要があります。ガベージコレクションする必要はありません。したがって、静的オブジェクトは高周波ヒープに格納されます。通常、アプリケーションドメインごとに1つの高周波ヒープがあります。

それでは、クラスの静的メンバーを見てみましょう。繰り返しますが、静的オブジェクトは、アプリケーションが実行されている間ずっとメモリに保持されるオブジェクトです。上記のロギング例を拡張すると、次のコードリストは静的メンバーを持つFileLoggerクラスがどのようになるかを示しています。

パブリック静的クラスFileLogger

    {{

        プライベート静的読み取り専用オブジェクトlockObject = new object();

        public static string FilePath

        {{

            取得する; セットする;

        }

        public static void Log(string message)

        {{

            ロック(lockObject)

            {{

                if(!string.IsNullOrEmpty(FilePath))

                using(StreamWriter streamWriter = new StreamWriter(FilePath、true))

                {{

                    streamWriter.WriteLine(メッセージ);

                    streamWriter.Close();

                }

            }

        }

    }

FilePath。という名前の静的プロパティの使用法に注意してください。スレッドセーフを確保するために、lockキーワードが使用されています。プロパティLog()の値がFilePathnullでも空でもないことを確認するために、メソッド内でチェックが行われました。

アプリケーションの速度が重要な場合は、静的メソッドを使用する方がよい場合があることを忘れないでください。静的クラスと非静的クラスの両方で使用できます。