C#: メソッドの基礎
1. メソッドとは何か
メソッドとは、特定のタスクを実行するコードのブロックのことです。繰り返し発生するロジックをメソッドにカプセル化することで、コードの再利用性と可読性が向上します。
C#では、Cのスタンドアロン関数とは異なり、メソッドはクラスまたは構造体(struct)内で定義する必要があります。トップレベルステートメントを使用する場合は、ローカル関数を定義することができます。
2. メソッドの定義と呼び出し
(1) 構文
access_modifier return_type method_name(parameter_list)
{
method_body
}
▶ サンプル
using System;
class Program
{
static void SayHello()
{
Console.WriteLine("Hello, World!");
}
static void Main()
{
SayHello();
SayHello();
}
}
Hello, World!
Hello, World!
method_name(arguments) という形式を使用します。メソッドは一度定義すればよく、何度でも呼び出すことができます。
3. パラメータと戻り値
(1) パラメータ付きの手法
パラメータを使用することで、メソッドは外部からデータを受け取り、さまざまな入力を処理できるようになります。
▶ サンプル
using System;
class Program
{
static void Greet(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
static void Main()
{
Greet("Alice");
Greet("Bob");
}
}
Hello, Alice!
Hello, Bob!
(2) 戻り値を持つメソッド
戻り値を使用することで、メソッドは計算結果を呼び出し元に返すことができます。
▶ サンプル
using System;
class Program
{
static int Add(int a, int b)
{
return a + b;
}
static void Main()
{
int result = Add(3, 5);
Console.WriteLine("3 + 5 = " + result);
Console.WriteLine("10 + 20 = " + Add(10, 20));
}
}
3 + 5 = 8
10 + 20 = 30
4. 形式パラメータと実パラメータ
| 概念 | 説明 | 例 |
|---|---|---|
| 形式パラメータ | メソッド定義内のパラメータ | a、b in static int Add(int a, int b) |
| 実引数 | メソッド呼び出し時に渡される値 | Add(3, 5) 内の 3、5 |
5. return文
return ステートメントには、2つの目的があります:
- 呼び出し元に結果を返す
- メソッドを直ちに終了する — それ以降のコードは実行されない
▶ サンプル
using System;
class Program
{
static string GetGrade(int score)
{
if (score >= 90)
return "Excellent";
if (score >= 60)
return "Pass";
return "Fail";
}
static int Max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
static void Main()
{
Console.WriteLine(GetGrade(95));
Console.WriteLine(GetGrade(70));
Console.WriteLine(GetGrade(45));
Console.WriteLine("Larger: " + Max(12, 8));
}
}
Excellent
Pass
Fail
Larger: 12
return が実行されると、そのメソッドは直ちに終了します。void 型ではないメソッドでは、すべてのコードパスが値を返す必要があります。
6. void メソッド
void は、そのメソッドに戻り値がないことを示します。void 型のメソッドでは return 文は必要ありませんが、return; を使用して早期に終了させることは可能です。
▶ サンプル
using System;
class Program
{
static void PrintLine(int length)
{
if (length <= 0)
return;
string line = new string('-', length);
Console.WriteLine(line);
}
static void PrintInfo(string name, int age)
{
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
}
static void Main()
{
PrintInfo("Alice", 18);
PrintLine(20);
PrintLine(-5);
}
}
Name: Alice
Age: 18
--------------------
return; は、早期終了のみに使用され、値を返しません。
7. メソッドの呼び出しスタック
コールスタックとは、プログラムがメソッドを実行する際に使用されるメモリ管理の仕組みです。メソッドが呼び出されるたびに、スタックフレームがスタックにプッシュされ、メソッドが戻ると、そのフレームがポップされます。
▶ サンプル
using System;
class Program
{
static int Square(int x)
{
return x * x;
}
static int SumOfSquares(int a, int b)
{
int sa = Square(a);
int sb = Square(b);
return sa + sb;
}
static void Main()
{
int result = SumOfSquares(3, 4);
Console.WriteLine("Result: " + result);
}
}
Result: 25
呼び出しのプロセスは以下の通りです:
1. Main() pushed onto stack
2. SumOfSquares(3, 4) pushed onto stack
3. Square(3) pushed → returns 9 → popped
4. Square(4) pushed → returns 16 → popped
5. SumOfSquares returns 25 → popped
6. Main → outputs 25 → popped
ℹ️ スタックは「後入れ先出し(LIFO)」の原則に従います。メソッドのネストが深くなるほど、スタックフレームの数も増えます。スタックの容量には限りがあるため、過度な再帰はスタックオーバーフローを引き起こす可能性があります。
8. メソッドの命名規則
C# のメソッド名には PascalCase が使用されます。各単語の最初の文字を大文字にし、アンダースコアは使用しません。
| スタイル | 例 | 言語 |
|---|---|---|
| パスカルケース | CalculateTotal, GetUserName |
C# |
| snake_case | calculate_total, get_user_name |
C, Python |
▶ サンプル
using System;
class Program
{
static double CalculateArea(double radius)
{
return 3.14159 * radius * radius;
}
static bool IsValidAge(int age)
{
return age >= 0 && age <= 150;
}
static void PrintUserInfo(string name, int age)
{
Console.WriteLine(name + ", age " + age);
}
static void Main()
{
double area = CalculateArea(5.0);
Console.WriteLine("Area: " + area);
Console.WriteLine("Valid age: " + IsValidAge(25));
PrintUserInfo("Alice", 25);
}
}
Area: 78.53975
Valid age: True
Alice, age 25
✅ メソッド名は、動詞または動詞句で始まるようにしてください。例:
Get、Set、Calculate、Is、
9. エクスプレッション・ボディを持つメソッド
C# 6.0 では、式本体を持つメソッドが導入され、=> を使用して 1 行のメソッド定義を簡略化できるようになりました。
▶ サンプル
using System;
class Program
{
static int Square(int x) => x * x;
static double CircleArea(double r) => 3.14159 * r * r;
static bool IsAdult(int age) => age >= 18;
static void Main()
{
Console.WriteLine(Square(7));
Console.WriteLine(CircleArea(3.0));
Console.WriteLine(IsAdult(20));
}
}
49
28.27431
True
=> はラムダ式の省略形であり、{ return expression; } と同等ですが、1行のロジックにのみ適用されます。
10. 値渡し
C# では、デフォルトで値渡しが行われます。値型の場合はデータそのものがコピーされ、参照型の場合は参照がコピーされます。
▶ サンプル
using System;
class Program
{
static void TryChange(int x)
{
x = 999;
}
static void Main()
{
int num = 10;
TryChange(num);
Console.WriteLine("num = " + num);
}
}
num = 10
11. 複数の戻り値型
メソッドは、int、double、string、bool など、さまざまな型を返すことができます。
▶ サンプル
using System;
class Program
{
static int GetLength(string text)
{
return text.Length;
}
static double GetAverage(int a, int b)
{
return (a + b) / 2.0;
}
static bool IsPositive(double value)
{
return value > 0;
}
static string BuildGreeting(string name)
{
return "Welcome, " + name + "!";
}
static void Main()
{
Console.WriteLine(GetLength("Hello"));
Console.WriteLine(GetAverage(3, 4));
Console.WriteLine(IsPositive(-2.5));
Console.WriteLine(BuildGreeting("Alice"));
}
}
5
3.5
False
Welcome, Alice!
❓ よくある質問
static void SayHi()。return; を使って早期に終了することはできますが、値を返すことはできません。📖 まとめ
- メソッドは、アクセス修飾子、戻り値の型、メソッド名、およびパラメータリストで構成される
- 形式引数は定義内の変数であり、実引数は呼び出し箇所で渡される値である
returnは結果を返し、メソッドを終了します。void 型のメソッドには戻り値がありません。- コールスタックは、後入れ先出し(LIFO)の原則に従って、メソッド実行時のメモリを管理します
- C# のメソッド名には PascalCase の命名規則が用いられます
- 式本体を持つメソッド
=>は、1行のメソッド定義を簡略化します - デフォルトの値渡し:値型はデータをコピーするため、形式引数を変更しても実引数には影響しません
📝 練習問題
- n の階乗を計算し、その結果を返す
static int Factorial(int n)メソッドを作成してください - 式本体構文を使用して、整数が偶数であるかどうかを判定する
static bool IsEven(int num)メソッドを作成してください。 - n に関する九九(1×n から 9×n まで)を出力する
static void PrintMultiplicationTable(int n)メソッドを作成してください。 - 得点に基づいて「Excellent」、「Good」、「Pass」、または「Fail」を返す
static string ClassifyScore(int score)メソッドを作成してください - 体重(kg)と身長(m)からBMIを計算する
static double CalcBMI(double weight, double height)メソッドを作成してください。