C#のメソッド:定義、呼び出し、パラメータ渡し、再帰を完全解説
メソッドとは、タスクを実行するために一緒に働くステートメントのグループです。すべてのC#プログラムには、Mainという名前のメソッドを持つクラスが少なくとも1つあります。
メソッドを使用するには、以下の2ステップが必要です。
- メソッドを定義する
- メソッドを呼び出す
メソッドの定義
メソッドを定義するとき、その構造の要素を宣言します。C#でのメソッド定義の構文は以下の通りです。
<Access Specifier> <Return Type> <Method Name>(Parameter List) {
Method Body
}
メソッドの構成要素
- アクセス修飾子 - 別のクラスから変数やメソッドの可視性を決定する
- 戻り値の型 - メソッドが返す値のデータ型。値を返さない場合は
void - メソッド名 - 一意の識別子で大文字小文字を区別。クラス内で他の識別子と同じ名は使用不可
- パラメータリスト - メソッドへのデータの受け渡しに使用。型、順序、数を指定。省略可能
- メソッド本体 - 必要な処理を完了するための命令セット
メソッド定義の例
class NumberManipulator {
public int FindMax(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
}
メソッドの呼び出し
メソッド名はメソッドの呼び出しに使用します。
同一クラス内からの呼び出し
using System;
namespace CalculatorApplication {
class NumberManipulator {
public int FindMax(int num1, int num2) {
int result;
if (num1 > num2) result = num1;
else result = num2;
return result;
}
static void Main(string[] args) {
int a = 100;
int b = 200;
int ret;
NumberManipulator n = new NumberManipulator();
// FindMaxメソッドの呼び出し
ret = n.FindMax(a, b);
Console.WriteLine("Max value is : {0}", ret);
Console.ReadLine();
}
}
}
実行結果:
Max value is : 200
別クラスからの呼び出し
using System;
namespace CalculatorApplication {
class NumberManipulator {
public int FindMax(int num1, int num2) {
int result;
if (num1 > num2) result = num1;
else result = num2;
return result;
}
}
class Test {
static void Main(string[] args) {
int a = 100, b = 200, ret;
NumberManipulator n = new NumberManipulator();
ret = n.FindMax(a, b);
Console.WriteLine("Max value is : {0}", ret);
Console.ReadLine();
}
}
}
再帰メソッド呼び出し
メソッドが自分自身を呼び出すことを再帰と呼びます。以下は再帰関数を使用して階乗を計算する例です。
using System;
namespace CalculatorApplication {
class NumberManipulator {
public int Factorial(int num) {
if (num == 1) {
return 1;
} else {
return Factorial(num - 1) * num;
}
}
static void Main(string[] args) {
NumberManipulator n = new NumberManipulator();
Console.WriteLine("Factorial of 6 is : {0}", n.Factorial(6));
Console.WriteLine("Factorial of 7 is : {0}", n.Factorial(7));
Console.WriteLine("Factorial of 8 is : {0}", n.Factorial(8));
Console.ReadLine();
}
}
}
実行結果:
Factorial of 6 is: 720
Factorial of 7 is: 5040
Factorial of 8 is: 40320
パラメータの渡し方
パラメータ付きメソッドを呼び出すとき、パラメータを渡す必要があります。パラメータの渡し方には3つの方法があります。
| No. | メカニズムと説明 |
|---|---|
| 1 | 値渡し(Value parameters) 実引数の実際の値が仮パラメータにコピーされる。関数内でパラメータを変更しても実引数には影響しない。 |
| 2 | 参照渡し(Reference parameters) 実引数のメモリ位置への参照が仮パラメータにコピーされる。パラメータへの変更が実引数に影響する。 refキーワードを使用。 |
| 3 | 出力パラメータ(Output parameters) 複数の値を返すのに役立つ。 outキーワードを使用。メソッド内で必ず値を割り当てる必要がある。 |
値渡しの例
void ModifyValue(int x) {
x = 20; // ローカルコピーのみ変更
}
int a = 10;
ModifyValue(a);
Console.WriteLine(a); // 10(変更されない)
参照渡し(ref)の例
void ModifyRef(ref int x) {
x = 20; // 元の変数が変更される
}
int a = 10;
ModifyRef(ref a);
Console.WriteLine(a); // 20(変更される)
出力パラメータ(out)の例
bool TryParseInt(string input, out int result) {
return int.TryParse(input, out result);
}
if (TryParseInt("123", out int number)) {
Console.WriteLine($"変換成功: {number}");
}
メソッドのオーバーロード
同じ名前で異なるパラメータリストを持つ複数のメソッドを定義できます。
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
public int Add(int a, int b, int c) => a + b + c;
ベストプラクティス
- メソッド名は動詞で始め、何をするか明確にする(
CalculateTotal,GetUserName) - 1つのメソッドは1つの責任のみを持つ(単一責任の原則)
- パラメータは原則として値渡し(
ref/outは必要最小限に) - 再帰はスタックオーバーフローに注意し、基本ケース(終了条件)を必ず定義する
- 大きな構造体を値渡しするとパフォーマンス低下の原因になるため、
readonly structやinパラメータを検討する
C言語
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C#メソッドオーバーロード完全ガイド:概念、例、ベストプラクティス
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C言語ビットフィールド:メモリ効率を最大化するテクニック
- C言語可変長引数のマスター:実践ガイド
- C# デリゲート完全ガイド:関数参照とイベントの仕組みを理解する
- C# 匿名メソッド:デリゲート利用をシンプルにする技法
- MATLAB積分マスター:不定積分からリーマン和まで
- Java 8デフォルトメソッド解説:インターフェース拡張と後方互換性