C#における静的コンストラクターとインスタンスコンストラクターの違いを徹底解説
C#には、クラスの初期化を行うためのコンストラクターとして、「静的コンストラクター(static constructor)」と「インスタンスコンストラクター(instance constructor)」の2種類が存在します。それぞれ役割や実行タイミングが異なるため、正しく理解して使い分けることが重要です。
静的コンストラクターとは
静的コンストラクターは、static修飾子を付けて宣言されるコンストラクターです。クラス内で最初に実行されるコードブロックであり、クラスのライフサイクル全体を通じて一度だけ実行されます。主に静的フィールド(staticフィールド)の初期化など、クラス自体に関わる初期化処理に使用されます。
インスタンスコンストラクターとは
インスタンスコンストラクターは、インスタンス(オブジェクト)のデータを初期化するためのコンストラクターです。newキーワードによってクラスのオブジェクトが生成されるたびに呼び出され、その都度実行されます。
両者の違いまとめ
- 静的コンストラクター: クラスが最初に使用されるタイミングで1回だけ自動的に実行される
- インスタンスコンストラクター: オブジェクトを生成するたびに呼び出される
- アクセス修飾子: 静的コンストラクターにはアクセス修飾子を付けられない(インスタンスコンストラクターはpublicなどを指定可能)
- 引数: 静的コンストラクターは引数を持てない(インスタンスコンストラクターは引数を取れる)
サンプルコード
次の例は、C#における静的コンストラクターとインスタンスコンストラクターの動作の違いを示したものです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Difference {
class Demo {
static int val1;
int val2;
static Demo() {
Console.WriteLine("This is Static Constructor");
val1 = 70;
}
public Demo(int val3) {
Console.WriteLine("This is Instance Constructor");
val2 = val3;
}
private void show() {
Console.WriteLine("First Value = " + val1);
Console.WriteLine("Second Value = " + val2);
}
static void Main(string[] args) {
Demo d1 = new Demo(110);
Demo d2 = new Demo(200);
d1.show();
d2.show();
Console.ReadKey();
}
}
}
実行結果
This is Static Constructor This is Instance Constructor This is Instance Constructor First Value = 70 Second Value = 110 First Value = 70 Second Value = 200
実行結果のポイント
この出力から、以下のことが確認できます。
- 「This is Static Constructor」が最初に1回だけ表示されていることから、静的コンストラクターはクラスが初めて使用される際に一度だけ実行されることがわかります。
- 「This is Instance Constructor」が2回表示されているのは、
new Demo(110)とnew Demo(200)の2つのオブジェクトを生成したため、その回数分だけインスタンスコンストラクターが呼び出されたことを意味します。 val1(静的フィールド)はすべてのインスタンスで共通の値「70」となっている一方、val2(インスタンスフィールド)は各オブジェクトごとに異なる値(110と200)を保持しています。
このように、静的コンストラクターはクラス全体に関わる初期化処理に、インスタンスコンストラクターは個々のオブジェクトごとの初期化処理に適しています。用途に応じて適切に使い分けましょう。
-
GoとJavaの違いを徹底比較!特徴と使い分けのポイント
プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ
-
Javaのコンストラクタとメソッドの違いとは?初心者向けに徹底解説
コンストラクタはオブジェクトを生成・初期化するために使われる特別なメソッドである一方、メソッドは特定の処理(ステートメント)を実行するために使われます。一見似ている両者ですが、役割や動作には明確な違いがあります。ここでは、コンストラクタとメソッドの重要な違いを7つの観点から表形式で整理して解説します。No.項目コンストラクタメソッド1目的オブジェクトの生成と初期化を行うために使用される。特定の処理やステートメントを実行するために使用される。2呼び出し方システムによって暗黙的に自動呼び出しされる。プログラムコードの中で明示的に呼び出す必要がある。3呼び出しタイミングnewキーワードでオブジェクト