〖C#入門〗staticメソッドとは?newなしでAddを呼び出してみよう

広告

前回は、Calcクラスからオブジェクトを作り、Addメソッドを呼び出しました。

Calc calc = new Calc();
int result = calc.Add(5, 3);

今回はAddメソッドにstaticを付け、new Calc()をせずに呼び出す方法を学びます。

前の記事:Addメソッドの基本|引数・戻り値・呼び出し


① 前回の呼び出し方を振り返る

前回のAddメソッドには、staticが付いていませんでした。

class Calc
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

このようなメソッドをインスタンスメソッドと呼びます。

呼び出す前に、newCalcのオブジェクトを作る必要があります。

Calc calc = new Calc();
int result = calc.Add(5, 3);

② Addメソッドにstaticを付ける

それでは、Addstaticを付けてみましょう。

class Calc
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

変わったのは、publicintの間にstaticが増えたことです。

public static int Add(int a, int b)
       ^^^^^^

staticを付けたメソッドを静的メソッド、またはstaticメソッドと呼びます。


③ newを使わずに呼び出す

staticメソッドは、オブジェクトを作らなくても呼び出せます。

int result = Calc.Add(5, 3);

呼び出し方は、次の形です。

クラス名.メソッド名(引数)

今回の場合は、クラス名がCalc、メソッド名がAddなので、Calc.Add(5, 3)となります。


④ 2つの呼び出し方を比べる

インスタンスメソッドとstaticメソッドを並べてみましょう。

staticなし

Calc calc = new Calc();
int result = calc.Add(5, 3);

new Calc()でオブジェクトを作り、そのオブジェクトから呼び出します。

staticあり

int result = Calc.Add(5, 3);

オブジェクトを作らず、クラス名から呼び出します。

違いは「どこに属するメソッドとして扱うか」です。

  • staticなし:作ったオブジェクトに属する
  • staticあり:クラスそのものに属する

⑤ なぜAddはstaticにできるのか

今回のAddは、引数として受け取ったabだけを使って計算します。

public static int Add(int a, int b)
{
    return a + b;
}

特定のCalcオブジェクトが持つデータを使っていません。

そのため、「どのオブジェクトのAddなのか」を区別する必要がなく、staticメソッドとして扱いやすい処理です。

今の段階では、次のように考えるとよいでしょう。

オブジェクトごとのデータを使わない共通の処理は、staticにできることがある

すべてのメソッドにstaticを付ければよい、という意味ではありません。


⑥ Studentのメソッドとの違い

たとえば、生徒の名前と点数を表示するShowScoreメソッドがあるとします。

class Student
{
    public string Name;
    public int Score;

    public void ShowScore()
    {
        Console.WriteLine($"{Name}さんは{Score}点です。");
    }
}

ShowScoreは、その生徒が持っているNameScoreを使います。

Student student = new Student();
student.Name = "田中";
student.Score = 80;

student.ShowScore();

このような処理は、「どの生徒なのか」が大切なので、インスタンスメソッドが自然です。

一方、Calc.Addは受け取った数字だけで計算するため、staticメソッドに向いています。


⑦ 完成したコード

using System;

class Program
{
    static void Main()
    {
        int result = Calc.Add(5, 3);
        Console.WriteLine(result);
    }
}

class Calc
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

実行結果は次のようになります。

8

new Calc()を書いていないことを確認してください。


⑧ よくある間違い

クラス名を書かずに呼び出す

MainAddが別のクラスにある場合、次の書き方ではAddを見つけられません。

int result = Add(5, 3); // エラー

Calcクラスのメソッドなので、クラス名を付けます。

int result = Calc.Add(5, 3); // OK

staticを付け忘れる

Addstaticがない場合、Calc.Add(5, 3)とは呼び出せません。

public static int Add(int a, int b)

定義側にstaticが付いているか確認しましょう。


⑨ 練習問題

Calc.Add(10, 4)の結果を表示してみましょう。

② staticメソッドとして、引き算をするSubを作ってみましょう。

③ staticメソッドとして、掛け算をするMultiplyを作ってみましょう。


⑩ まとめ

今回のポイントを振り返りましょう。

  • staticメソッドは、クラスそのものに属する
  • newでオブジェクトを作らなくても呼び出せる
  • Calc.Add()のように「クラス名.メソッド名」で呼び出す
  • オブジェクトごとのデータを使わない共通処理は、staticにできることがある
  • オブジェクトごとのデータを使う処理には、インスタンスメソッドが自然

次回は、同じAddという名前で整数と小数の両方を扱う「オーバーロード」と、引数を省略できる仕組みを学びます。

次の記事:メソッドのオーバーロードと省略可能な引数

訪問数 2 回, 今日の訪問数 2回

広告