zukucode
主にWEB関連の情報を技術メモとして発信しています。

C# クラスをnewせずにクラス内のメソッドを実行する

C#でクラスをnew(インスタンス生成)せずに、クラス内のメソッドを実行する方法を紹介します。

例えば以下のクラスがあるとします。

public class Hepler
{
    public int Increment(int number) {
        return number + 1;
    }
}

Incrementメソッドを呼びたいときは以下のようにする必要があります。

int a = 1;
var helper = new Hepler();
int b = hepler.Increment(a); // b = 2

new(インスタンス生成)せずに、Incrementメソッドを呼びたいときはstaticメソッドにする必要があります。

Incrementメソッドにstaticのキーワードを追加します。

public class Hepler
{
    public int Increment(int number) {
    public static int Increment(int number) {
        return number + 1;
    }
}

staticメッソドにすれば以下のようにnew(インスタンス生成)せずにメソッドを呼ぶことができます。

int a = 1;
int b = Hepler.Increment(a); // b = 2

注意点

以下のようにstaticメソッドの外にある変数を参照しているとstaticメソッドにすることはできません。

public class Hepler
{
    public int step = 3;
    public static int Increment(int number) { // コンパイルエラー
        return number + step;
    }
}

これは、以下のようにHelperクラスがstepという状態を保持しており、Incrementメソッドはstephelperクラスの状態)を参照しているため、staticメソッドにすることはできません。

int a = 1;
var helper = new Hepler();
helper.step = 2;
int b = hepler.Increment(a); // b = 3
helper.step = 3;
int c = hepler.Increment(a); // c = 4


Helper.Increment(a); // stepの値がわからない
// インスタンス生成をしてHelperクラスの状態を確定させる必要がある
var helper = new Hepler();
int d = hepler.Increment(a); // d = 4

HelperUtilといったような汎用的なクラスは基本的には状態を持たないことが多いので、クラスにstaticキーワードを追加して、そのクラス内のメソッドをすべてstaticにするよう強制すると良いかと思います。

public class Hepler
public static class Hepler
{
    public int Decrement(int number) { // コンパイルエラー
    public static int Decrement(int number) {
        return number - 1;
    }

    public static int Increment(int number) {
        return number + 1;
    }
}

関連記事