C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】静的クラスのインスタンスが1つだけ生成されることを証明する方法

C#では、静的クラス(static class)はアプリケーション全体でただ1つのインスタンスしか持ちません。本記事では、静的変数を活用して、この仕組みを実際にコードで証明する方法を解説します。

静的クラスと静的変数の仕組み

静的クラス内で宣言された静的変数は、いわばグローバル変数のように扱われます。そのため、プログラムの実行中に何度アクセスしても値が保持され続け、リセットされることはありません。

この性質を利用すると、静的コンストラクタが呼び出されるのが一度だけであること、そしてインスタンスが複数生成されないことを簡単に確認できます。

サンプルコード

以下の例では、静的クラス Demo を作成し、静的変数 count を宣言しています。静的コンストラクタが呼び出されたタイミングをコンソールに出力することで、初期化が一度だけ行われることを確認できます。

static class Demo{
    public static int count;
    static Demo(){
        System.Console.WriteLine("Static Constructor called");
    }
}
class Program{
    static void Main(){
        Demo.count++;
        Demo.count++;
        System.Console.WriteLine(Demo.count);
        Console.ReadKey();
    }
}

実行結果

Static Constructor called
2

結果の解説

実行結果から、次の2つの重要なポイントが読み取れます。

  • 「Static Constructor called」が1回だけ表示される:静的コンストラクタは、クラスが最初に使用されるタイミングで.NETランタイムによって自動的に一度だけ呼び出されます。これにより、静的クラスのインスタンスが1つしか存在しないことが保証されます。
  • count の値が「2」と表示されるDemo.count++ を2回実行したため、値が1ずつ加算されて合計2になります。静的変数はすべてのコードから同じメモリ領域を共有しているため、値が保持され続けます。

まとめ

静的クラスの静的変数はグローバルな状態として機能し、静的コンストラクタは一度しか実行されません。この動作を観察することで、「静的クラスのインスタンスはアプリケーション内に1つだけ生成される」というC#の仕様を実際のコードで証明できます。

  1. 【JavaScript】特定のキーを除いたオブジェクトをコピーする方法(シャローコピーとディープコピー)

    JavaScriptであるオブジェクトをコピーしたいけれど、特定のキー(プロパティ)だけは含めたくない——そんな場面は開発でよくあります。最もシンプルな方法は、まずオブジェクト全体をコピーし、その後不要なプロパティを削除するというアプローチです。ただし、オブジェクトのコピーには「浅いコピー(シャローコピー)」と「深いコピー(ディープコピー)」という2種類がある点に注意が必要です。それぞれの特徴と使い方を見ていきましょう。シャローコピー(浅いコピー)とはシャローコピーは、可能な限り最小限の複製を行う方法です。コレクションの「構造」だけがコピーされ、中身の要素までは複製されません。つまり、元のオブ

  2. 【JavaScript】オブジェクトがクラスのインスタンスかどうかを判定する方法

    JavaScriptでは、instanceof 演算子を使うことで、あるオブジェクトが特定のクラス(コンストラクタ関数)のインスタンスであるかどうかを簡単に判定できます。instanceof 演算子とは?instanceof 演算子は、左辺のオブジェクトが右辺に指定したコンストラクタ関数のプロトタイプチェーン上に存在するかどうかを評価し、その結果を真偽値(true / false)として返します。この仕組みを利用することで、オブジェクトがどのクラスから生成されたものなのかを実行時に動的にチェックできます。コード例以下は、ボタンをクリックしたときに student1 オブジェクトが Studen