〖C#入門〗staticメソッドとは?newなしでAddを呼び出してみよう
前回は、Calcクラスからオブジェクトを作り、Addメソッドを呼び出しました。
Calc calc = new Calc();
int result = calc.Add(5, 3);
今回はAddメソッドにstaticを付け、new Calc()をせずに呼び出す方法を学びます。
① 前回の呼び出し方を振り返る
前回のAddメソッドには、staticが付いていませんでした。
class Calc
{
public int Add(int a, int b)
{
return a + b;
}
}
このようなメソッドをインスタンスメソッドと呼びます。
呼び出す前に、newでCalcのオブジェクトを作る必要があります。
Calc calc = new Calc();
int result = calc.Add(5, 3);
② Addメソッドにstaticを付ける
それでは、Addにstaticを付けてみましょう。
class Calc
{
public static int Add(int a, int b)
{
return a + b;
}
}
変わったのは、publicとintの間に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は、引数として受け取ったaとbだけを使って計算します。
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は、その生徒が持っているNameとScoreを使います。
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()を書いていないことを確認してください。
⑧ よくある間違い
クラス名を書かずに呼び出す
MainとAddが別のクラスにある場合、次の書き方ではAddを見つけられません。
int result = Add(5, 3); // エラー
Calcクラスのメソッドなので、クラス名を付けます。
int result = Calc.Add(5, 3); // OK
staticを付け忘れる
Addにstaticがない場合、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という名前で整数と小数の両方を扱う「オーバーロード」と、引数を省略できる仕組みを学びます。






ディスカッション
コメント一覧
まだ、コメントがありません