C#の静的メソッドと非静的メソッドの違いと使い方を解説
C#では、メンバー関数(メソッド)をstaticキーワードを使って静的メソッドとして宣言できます。静的メソッドには以下のような特徴があります。
- 静的変数にのみアクセス可能:静的メソッドの内部からアクセスできるのは、静的なフィールド(変数)だけです。
- オブジェクト生成前に存在:静的メソッドはクラスがロードされた時点で存在するため、インスタンス(オブジェクト)を作成しなくても呼び出せます。
- クラス名で直接呼び出し可能:
ClassName.MethodName()の形式で、インスタンス化なしに利用できます。
静的クラスについて
static を付けたクラスはインスタンス化できません。また、静的クラスが含めることができるのは静的メンバーのみです。ユーティリティ的な処理や共通機能をまとめる際に活用されます。
静的メソッドの定義方法
静的メソッドは、戻り値の型の前に static キーワードを付けて宣言します。
public static int getNum() {
return num;
}
サンプルコード:静的メソッドと非静的メソッドの使い方
次の例では、非静的メソッド count() でカウントアップを行い、静的メソッド getNum() でその値を取得しています。
using System;
namespace StaticVarApplication {
class StaticVar {
public static int num;
// 非静的メソッド:インスタンスから呼び出す
public void count() {
num++;
}
// 静的メソッド:クラス名で直接呼び出す
public static int getNum() {
return num;
}
}
class StaticTester {
static void Main(string[] args) {
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
s.count();
s.count();
s.count();
Console.WriteLine("Variable num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}
実行結果
Variable num: 6
コードのポイント解説
- 変数
numはpublic static intとして宣言された静的変数です。すべてのインスタンス間で値が共有されます。 count()は非静的メソッドのため、new StaticVar()で作成したインスタンスsを介して呼び出します。getNum()は静的メソッドのため、インスタンスを作らずにStaticVar.getNum()という形でクラス名から直接呼び出せます。count()を6回呼び出しているため、実行結果として「6」が出力されます。
このように、静的メソッドはインスタンスに依存しない処理に、非静的メソッドは個々のオブジェクトの状態を扱う処理に適しています。用途に応じて使い分けることで、より読みやすく保守性の高いC#コードを書くことができます。
-
Javaにおける静的バインディングと動的バインディングの違いを徹底解説
静的バインディングと動的バインディングとは?Javaでは、メソッド呼び出しと実際の処理内容を結び付ける(バインドする)タイミングによって、「静的バインディング」と「動的バインディング」の2種類に分けられます。この仕組みを理解することは、ポリモーフィズム(多態性)や継承を正しく扱う上で非常に重要です。静的バインディング(早期バインディング)コンパイルの時点で、どのメソッドや変数が使用されるかが確定できる場合、コンパイラは参照を静的に結び付けます。これが静的バインディングです。具体的には、以下のような要素が静的バインディングの対象となります。static変数・staticメソッド:クラスレベルで管
-
Pythonのクラスメソッドと静的メソッドの違いを徹底解説
Pythonにおけるクラスメソッド(classmethod)は、クラスのインスタンスではなく、クラスそのものに紐づけられるメソッドです。静的メソッド(staticmethod)もこれと似ていますが、両者にはいくつかの重要な違いがあります。クラスメソッドには@classmethodデコレータを、静的メソッドには@staticmethodデコレータをそれぞれ付与して定義します。 クラスメソッドの構文 class my_class: @classmethod def function_name(cls, arguments): # 関数の処理内容