【C#】static とは | static を定義して使用する方法

この記事では「static」と呼ばれるキーワードについて解説します。staticキーワードは、これまでのサンプルでもアプリケーションで記述してきたと思いますが、内容については触れてきませんでしたので、ここで解説していきたいと思います。

「static」は一般的に「静的メンバー」と呼ばれており、アプリケーション内で共有されるメンバーになります。よく使用されるので覚えておくと良いでしょう。

static とは

「static」キーワードは静的メンバーを生成するときに使用するものです。この「静的メンバー」とは、クラス・メソッド・変数などをインスタンス毎に保有するのではなく、アプリケーション全体で一つだけ生成したいときに使用します。

「静的メンバー」と対比されるのが「インスタンス」であり、インスタンスは「new」キーワードを使用して、使いたいときにインスタンスを生成して使用します。それに対して「静的メンバー」はアプリケーションに一つだけと覚えておきましょう。

「static」はC#では「アクセス修飾子」の後に続けてキーワードを付与します。「アクセス修飾子」については「【C#】アクセス修飾子とは | アクセス修飾子の基本を解説」をご確認ください。以下のようにC#では記述します。

//クラス
public static class XXX{  }
//メソッド
public static void XXX(){  }
//変数
public static int XXX;

staticを付与してアプリケーションで1つしか持たないようにするかどうかは、「インスタンスを複数生成する必要があるかどうか」で決定するようにしましょう。具体的には「共通して使いまわせる処理かどうか」ですね。

staticの使い方

それではstaticの使い方をサンプルコードを交えて解説していきます。新規のコンソールアプリケーションを作成して、以下を記述して実際に起動してみましょう。今回はファイルを1つ追加で作成します。

まずはメインとなるProgram.csを以下のように記述します。じつはこのクラスは静的メンバーのメソッドを一つ持っているクラスです。「static void Maint」というメソッドは、アプリケーションの一番最初のメソッドになるので1つしか持たないようになっています。

using System;

namespace App01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("数字を入力してください。");
            int input = Convert.ToInt32(Console.ReadLine());
            
            //5を足すメソッドを呼び出す
            int answer1 = Calculation.AlwaysAddFive(input);
            Console.WriteLine("5を足した結果:" + answer1.ToString());

            int answer2 = Calculation.AlwaysMultiFice(input);
            Console.WriteLine("5を掛け算結果:" + answer2.ToString());

            Console.ReadLine();
        }
    }
}

それではもう一つ、静的メンバーのクラスを作成していきます。「【C#】Visual Studio でプロジェクトにフォルダとファイルを追加する方法」で紹介した方法で新しいクラスを追加してみてください。名前は「Calculation.cs」で良いでしょう。簡単な計算をするための共通クラスのイメージです。

namespace App02
{
    public static class Calculation
    {
        //単なる5
        private static int Five = 5;

        //常に5を加算するメソッド
        public static int AlwaysAddFive(int input)
        {
            return input + Five;
        }

        //常に5を乗算するメソッド
        public static int AlwaysMultiFive(int input)
        {
            return input * Five;
        }
    }
}

このクラスには2つほど静的メソッドを持っており、1つの静的フィールドを持っています。上記のクラスで、静的メンバーをクラスから変数まで無理やり揃えることに成功しました。

静的クラスを生成する

まずはじめは静的クラスを作成する方法です。アクセス修飾子の後にstaticを付けるのがお約束でした。クラスを定義している箇所は以下になります。

public static class Calculation
{
    //省略
}

Calculationというクラスを作成しました。これは「計算」という処理はインスタンスの条件によらず、アプリケーションにおいて「不変」であり「共通化」できる項目になるからです。

静的クラスを作成する場合は「(アクセス修飾子) static class(クラス名) 」と覚えておきましょう。また静的クラスを使用する場合は「new」キーワードを使用する必要はありません。Program.csの以下の記述に注目してください。

int answer1 = Calculation.AlwaysAddFive(input);

クラス名である「Calculation」を指定してメソッドを呼んでいることが分かりますね。このように静的クラスはインスタンスを生成せずに、静的クラスの名称で処理へとアクセスすることができます。

静的メソッドを生成する

クラスに続いて静的メソッドを生成する方法を解説します。基本的に静的メソッドは静的クラスの内部で定義することがほとんどになります。サンプルでは以下のように静的メソッドを定義しています。

//常に5を加算するメソッド
public static int AlwaysAddFive(int input)
{
    return input + Five;
}

ここでは「(アクセス修飾子) static (戻り値) (メソッド名)」で定義しています。staticキーワードはアクセス修飾子の後に続けて記述すると覚えておきましょう。静的メソッドの呼び方はインスタンスして生成するメソッドを呼ぶ時と変わりはありません。

Calculation.AlwaysAddFive(input);

ただ呼ぶときは静的クラスをインスタンスせず、そのままメソッドを呼ぶようになります。これは一般的なメソッドとは違う点になるので注意が必要になりますね。

静的フィールドを生成する

最後に静的フィールドを生成する方法を紹介します。該当する箇所は以下になります。

private static int Five = 5;

この変数を定義する意味はまったくないのですが、あくまでもサンプル的に静的フィールドを作ってみました。ここでも定義方法に変わりはありません。アクセス修飾子の後にstaticキーワードがきていることを押さえておきましょう。

インスタンスとstaticを区別しよう

以上、静的メンバーと呼ばれる「static」について解説しました。staticキーワードを付けることでインスタンスを生成することなく、処理にアクセスすることができます。

staticキーワードはアクセス修飾子の後に付くようにして宣言するのが一般的になりますので忘れないようにしましょう。また、インスタンスとstaticの違いをしっかりと押さえておく必要もあります。

staticを付けるには「共通化」や「インスタンスを複数生成する必要性」に着目して考えるのがオススメです。何でもかんでもstaticを付けるよりは、しっかりと意図をもって付けるようにしてください。