C#: メソッドの基礎

1. メソッドとは何か

メソッドとは、特定のタスクを実行するコードのブロックのことです。繰り返し発生するロジックをメソッドにカプセル化することで、コードの再利用性と可読性が向上します。

C#では、Cのスタンドアロン関数とは異なり、メソッドはクラスまたは構造体(struct)内で定義する必要があります。トップレベルステートメントを使用する場合は、ローカル関数を定義することができます。


2. メソッドの定義と呼び出し

(1) 構文

TEXT 📖 参照専用
access_modifier return_type method_name(parameter_list)
{
    method_body
}

▶ サンプル

CSHARP
using System;

class Program
{
    static void SayHello()
    {
        Console.WriteLine("Hello, World!");
    }

    static void Main()
    {
        SayHello();
        SayHello();
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Hello, World!
Hello, World!
💡 メソッドを呼び出すには、method_name(arguments) という形式を使用します。メソッドは一度定義すればよく、何度でも呼び出すことができます。


3. パラメータと戻り値

(1) パラメータ付きの手法

パラメータを使用することで、メソッドは外部からデータを受け取り、さまざまな入力を処理できるようになります。

▶ サンプル

CSHARP
using System;

class Program
{
    static void Greet(string name)
    {
        Console.WriteLine("Hello, " + name + "!");
    }

    static void Main()
    {
        Greet("Alice");
        Greet("Bob");
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Hello, Alice!
Hello, Bob!

(2) 戻り値を持つメソッド

戻り値を使用することで、メソッドは計算結果を呼び出し元に返すことができます。

▶ サンプル

CSHARP
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));
    }
}
▶ 試してみよう
TEXT 📖 参照専用
3 + 5 = 8
10 + 20 = 30

4. 形式パラメータと実パラメータ

概念 説明
形式パラメータ メソッド定義内のパラメータ ab in static int Add(int a, int b)
実引数 メソッド呼び出し時に渡される値 Add(3, 5) 内の 35
⚠️ 形式引数は変数宣言であり、実引数は具体的な値や式です。メソッドが呼び出されると、実引数の値が対応する形式引数に渡されます。


5. return文

return ステートメントには、2つの目的があります:

  1. 呼び出し元に結果を返す
  2. メソッドを直ちに終了する — それ以降のコードは実行されない

▶ サンプル

CSHARP
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));
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Excellent
Pass
Fail
Larger: 12
⚠️ return が実行されると、そのメソッドは直ちに終了します。void 型ではないメソッドでは、すべてのコードパスが値を返す必要があります。


6. void メソッド

void は、そのメソッドに戻り値がないことを示します。void 型のメソッドでは return 文は必要ありませんが、return; を使用して早期に終了させることは可能です。

▶ サンプル

CSHARP
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);
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Name: Alice
Age: 18
--------------------
📌 void メソッド内の return; は、早期終了のみに使用され、値を返しません。


7. メソッドの呼び出しスタック

コールスタックとは、プログラムがメソッドを実行する際に使用されるメモリ管理の仕組みです。メソッドが呼び出されるたびに、スタックフレームがスタックにプッシュされ、メソッドが戻ると、そのフレームがポップされます。

▶ サンプル

CSHARP
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);
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Result: 25

呼び出しのプロセスは以下の通りです:

TEXT 📖 参照専用
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

▶ サンプル

CSHARP
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);
    }
}
▶ 試してみよう
TEXT 📖 参照専用
Area: 78.53975
Valid age: True
Alice, age 25

✅ メソッド名は、動詞または動詞句で始まるようにしてください。例:GetSetCalculateIsPrint など。


9. エクスプレッション・ボディを持つメソッド

C# 6.0 では、式本体を持つメソッドが導入され、=> を使用して 1 行のメソッド定義を簡略化できるようになりました。

▶ サンプル

CSHARP
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));
    }
}
▶ 試してみよう
TEXT 📖 参照専用
49
28.27431
True
🚀 => はラムダ式の省略形であり、{ return expression; } と同等ですが、1行のロジックにのみ適用されます。


10. 値渡し

C# では、デフォルトで値渡しが行われます。値型の場合はデータそのものがコピーされ、参照型の場合は参照がコピーされます。

▶ サンプル

CSHARP
using System;

class Program
{
    static void TryChange(int x)
    {
        x = 999;
    }

    static void Main()
    {
        int num = 10;
        TryChange(num);
        Console.WriteLine("num = " + num);
    }
}
▶ 試してみよう
TEXT 📖 参照専用
num = 10
⚠️ 値渡しでは、形式パラメータは実パラメータのコピーとなります。メソッド内で形式パラメータを変更しても、実パラメータには影響しません。


11. 複数の戻り値型

メソッドは、intdoublestringbool など、さまざまな型を返すことができます。

▶ サンプル

CSHARP
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"));
    }
}
▶ 試してみよう
TEXT 📖 参照専用
5
3.5
False
Welcome, Alice!

❓ よくある質問

Q メソッドにパラメータを指定しないことはできますか?
A はい、パラメータリストを空にすれば可能です。例:static void SayHi()
Q メソッドに複数のreturn文を含めることはできますか?
A はい、できますが、voidではないメソッドでは、すべての実行パスで値を返さなければなりません。
Q void メソッドで return を使うことはできますか?
A はい、return; を使って早期に終了することはできますが、値を返すことはできません。
Q 形式引数と実引数の名前は同じでなければならないのでしょうか?
A いいえ、これらは独立した変数であるため、異なる名前を付けることができます。
Q C#のメソッドはクラスの外にも存在できますか?
A いいえ、C#のメソッドはクラスまたは構造体の中に定義する必要がありますが、ローカル関数はトップレベルで定義することができます。

📖 まとめ

📝 練習問題

  1. n の階乗を計算し、その結果を返す static int Factorial(int n) メソッドを作成してください
  2. 式本体構文を使用して、整数が偶数であるかどうかを判定する static bool IsEven(int num) メソッドを作成してください。
  3. n に関する九九(1×n から 9×n まで)を出力する static void PrintMultiplicationTable(int n) メソッドを作成してください。
  4. 得点に基づいて「Excellent」、「Good」、「Pass」、または「Fail」を返す static string ClassifyScore(int score) メソッドを作成してください
  5. 体重(kg)と身長(m)からBMIを計算するstatic double CalcBMI(double weight, double height)メソッドを作成してください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%