C# メソッドとは?定義・呼び出し方・引数・戻り値を初心者向けにわかりやすく解説

はじめに

C#でプログラムを作るうえで、メソッドは欠かせない仕組みです。メソッドを使うと、複数の処理をひとまとまりにして名前を付け、必要な場所から繰り返し呼び出せます。

たとえば、「メッセージを表示する」「2つの数値を足す」「入力された年齢が成人か判定する」といった処理を、それぞれ独立したメソッドとして定義できます。処理を適切にメソッドへ分けることで、コードが読みやすくなり、修正や再利用もしやすくなります。

この記事では、C#のメソッドについて、定義方法、呼び出し方、引数、戻り値、staticメソッドとインスタンスメソッドの違いなどを、初心者向けにコード例を交えながら解説します。

1. C#のメソッドとは?

1-1. メソッドの基本的な意味

C#のメソッドとは、特定の処理をひとまとまりにして名前を付けたものです。

たとえば、画面にあいさつを表示する処理は、次のようなメソッドとして定義できます。

static void ShowGreeting(){Console.WriteLine("こんにちは");}

この例では、ShowGreetingがメソッド名です。中括弧{ }の中に、実行したい処理を書きます。

定義したメソッドは、次のようにメソッド名の後ろへ丸括弧を付けて呼び出します。

ShowGreeting();

呼び出されると、ShowGreetingメソッド内の処理が実行され、「こんにちは」と表示されます。

1-2. メソッドを使う目的

メソッドを使う主な目的は、処理を整理して再利用できるようにすることです。

同じ処理を複数の場所に直接書くと、コードが長くなり、修正箇所も増えてしまいます。処理をメソッドとしてまとめておけば、必要な場所から何度でも呼び出せます。

static void ShowSeparator(){Console.WriteLine("--------------------");}

static void Main(){ShowSeparator();Console.WriteLine("商品一覧");ShowSeparator();}

区切り線を表示する処理は1か所にしか書かれていませんが、ShowSeparator()を2回呼び出すことで同じ処理を繰り返しています。

1-3. メソッドと関数の違い

「メソッド」と「関数」は、どちらも処理をまとめたものを表す言葉です。

一般的には、クラスや構造体などの型に属している関数を「メソッド」と呼びます。C#では、基本的に処理はクラスや構造体などの中に定義されるため、「メソッド」という言葉が使われます。

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

この例のAddは、Calculatorクラスに属するメソッドです。

日常的な会話では、C#のメソッドを「関数」と呼ぶこともあります。初心者の段階では、C#ではクラスなどに属する処理をメソッドと呼ぶ、と理解しておけばよいでしょう。

1-4. メソッドを使うメリット

C#でメソッドを使う主なメリットは、次のとおりです。

  • 同じ処理を繰り返し利用できる

  • コードの重複を減らせる

  • 処理の目的がわかりやすくなる

  • 修正する場所をまとめられる

  • 動作確認やテストを行いやすくなる

  • 複雑な処理を小さな単位に分割できる

たとえば、税込価格を計算する処理をメソッドにしておけば、税率や計算方法を変更するときも、基本的にはそのメソッドだけを修正すれば済みます。

static decimal CalculateTaxIncludedPrice(decimal price){return price * 1.1m;}

2. C#メソッドの基本構文

2-1. メソッド定義の書き方

C#のメソッドは、基本的に次の形式で定義します。

アクセス修飾子 戻り値の型 メソッド名(引数リスト){実行する処理}

実際のコードでは、次のように書きます。

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

それぞれの部分には、次の意味があります。

  • public:どこから呼び出せるかを指定するアクセス修飾子

  • int:メソッドが返す値の型

  • Add:メソッド名

  • int a, int b:メソッドが受け取る引数

  • return a + b;:計算結果を呼び出し元へ返す処理

staticを付ける場合は、一般的にアクセス修飾子と戻り値の型の間へ記述します。

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

2-2. アクセス修飾子とは

アクセス修飾子は、そのメソッドをどこから呼び出せるかを指定するキーワードです。

代表的なアクセス修飾子には、次のものがあります。

アクセス修飾子主な意味
publicほかのクラスからも呼び出せる
private同じクラスの中からのみ呼び出せる
protected同じクラスと派生クラスから呼び出せる
internal同じアセンブリ内から呼び出せる
protected internal同じアセンブリ内、または派生クラスから呼び出せる
private protected同じアセンブリ内の派生クラスから呼び出せる

初心者が最初によく使うのは、publicprivateです。

class UserService{public void RegisterUser(){ValidateInput();Console.WriteLine("ユーザーを登録しました");}

private void ValidateInput(){Console.WriteLine("入力内容を確認しました");}

}

RegisterUserはクラスの外から呼び出せますが、ValidateInputUserServiceクラスの内部からしか呼び出せません。

2-3. 戻り値の型とは

戻り値の型は、メソッドが呼び出し元へ返す値の種類を指定するものです。

整数を返す場合はint、文字列を返す場合はstring、真偽値を返す場合はboolなどを指定します。

static int GetNumber(){return 100;}

static string GetMessage(){return "処理が完了しました";}

static bool IsAvailable(){return true;}

値を返さないメソッドでは、戻り値の型にvoidを指定します。

static void ShowMessage(){Console.WriteLine("メッセージを表示します");}

2-4. メソッド名の命名ルール

C#のメソッド名には、処理内容がわかる名前を付けることが重要です。

一般的には、単語の先頭を大文字にするPascalCaseを使用します。

CalculateTotalPrice()ShowUserName()SaveFile()CheckLoginStatus()

次のような曖昧な名前は、できるだけ避けましょう。

DoIt()Process()Method1()Test()

たとえば、ユーザー情報を保存するメソッドなら、SaveUserSaveUserInformationのような名前にすると目的が伝わりやすくなります。

なお、メソッド名の先頭に数字は使えません。また、空白やハイフンも使えません。

// 使用できない例// void 1stMethod() { }// void Show-Message() { }

2-5. 引数リストの基本

引数リストには、メソッドが受け取る値の型と名前を記述します。

static void ShowName(string name){Console.WriteLine(name);}

この例では、stringが引数の型、nameが引数名です。

複数の引数を受け取る場合は、カンマで区切ります。

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

引数が必要ない場合は、丸括弧の中を空にします。

static void ShowMessage(){Console.WriteLine("引数はありません");}

3. C#でメソッドを定義する方法

3-1. 引数なし・戻り値なしのメソッド

引数も戻り値もないメソッドは、決まった処理を実行する場合に適しています。

static void ShowWelcomeMessage(){Console.WriteLine("ようこそ");}

呼び出し方は次のとおりです。

ShowWelcomeMessage();

引数を受け取らないため丸括弧の中は空です。また、戻り値がないためvoidを指定しています。

3-2. 引数ありのメソッド

呼び出すたびに異なる値を使いたい場合は、引数を定義します。

static void ShowGreeting(string name){Console.WriteLine($"こんにちは、{name}さん");}

呼び出すときは、丸括弧の中へ値を渡します。

ShowGreeting("田中");ShowGreeting("佐藤");

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

こんにちは、田中さんこんにちは、佐藤さん

引数を使うことで、同じメソッドを異なるデータに対して利用できます。

3-3. 戻り値ありのメソッド

計算結果や取得したデータを呼び出し元へ返したい場合は、戻り値を持つメソッドを定義します。

static int GetAge(){return 20;}

返された値は、変数へ代入できます。

int age = GetAge();Console.WriteLine(age);

戻り値の型としてintを指定しているため、returnでは整数を返す必要があります。

3-4. 引数と戻り値の両方を持つメソッド

実際のプログラムでは、引数を受け取って処理し、その結果を返すメソッドがよく使われます。

static int Multiply(int a, int b){return a * b;}

呼び出し例は次のとおりです。

int result = Multiply(4, 5);Console.WriteLine(result);

実行結果は20です。

このメソッドでは、abを受け取り、掛け算した結果をreturnで返しています。

3-5. voidメソッドの使い方

voidは、呼び出し元へ値を返さないことを表します。

画面表示、ファイル保存、データの更新など、結果を戻り値として受け取る必要がない処理で使われます。

static void PrintResult(int result){Console.WriteLine($"結果は{result}です");}

voidメソッドでは値を伴うreturnは使えません。

static void ShowMessage(){Console.WriteLine("処理中です");// return 10;  // コンパイルエラー}

ただし、値を付けないreturn;を使って、メソッドの処理を途中で終了することはできます。

static void ShowPositiveNumber(int number){if (number <= 0){return;}

Console.WriteLine(number);

}

4. C#でメソッドを呼び出す方法

4-1. 同じクラス内のメソッドを呼び出す

同じクラス内にあるメソッドは、基本的にメソッド名を指定して呼び出せます。

class Program{static void ShowMessage(){Console.WriteLine("メソッドを呼び出しました");}

static void Main(){ShowMessage();}

}

MainメソッドからShowMessage()を呼び出すと、ShowMessage内の処理が実行されます。

インスタンスメソッドから同じインスタンスの別のメソッドを呼ぶ場合も、メソッド名だけで呼び出せます。

class User{public void Introduce(){ShowName();}

private void ShowName(){Console.WriteLine("山田です");}

}

4-2. 別クラスのメソッドを呼び出す

別クラスのインスタンスメソッドを呼び出すには、そのクラスのインスタンスを作成します。

class MessageService{public void ShowMessage(){Console.WriteLine("別クラスのメソッドです");}}

class Program{static void Main(){MessageService service = new MessageService();service.ShowMessage();}}

new MessageService()でインスタンスを作成し、変数名とメソッド名をドットでつないで呼び出します。

service.ShowMessage();

呼び出すメソッドがprivateになっている場合は、別クラスから呼び出せません。別クラスから利用する必要があるメソッドには、通常publicを指定します。

4-3. staticメソッドの呼び出し方

staticメソッドは、クラス自体に属するメソッドです。インスタンスを作成せず、クラス名から呼び出せます。

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

class Program{static void Main(){int result = Calculator.Add(10, 20);Console.WriteLine(result);}}

同じクラス内のstaticメソッドであれば、クラス名を省略して呼び出すこともできます。

4-4. インスタンスメソッドの呼び出し方

インスタンスメソッドは、作成したオブジェクトごとに利用するメソッドです。

class Counter{private int count;

public void Increment(){count++;}public int GetCount(){return count;}

}

呼び出すには、newを使ってインスタンスを作成します。

Counter counter = new Counter();

counter.Increment();counter.Increment();

Console.WriteLine(counter.GetCount());

この例では、counterが自身のcountを保持しています。

別のインスタンスを作ると、状態も別々になります。

Counter counter1 = new Counter();Counter counter2 = new Counter();

counter1.Increment();

Console.WriteLine(counter1.GetCount()); // 1Console.WriteLine(counter2.GetCount()); // 0

4-5. Mainメソッドから呼び出す例

Mainメソッドは、コンソールアプリケーションの実行開始地点として使われるメソッドです。

class Program{static void Main(){ShowTitle();

    int total = Add(30, 20);Console.WriteLine($"合計:{total}");}static void ShowTitle(){Console.WriteLine("計算プログラム");}static int Add(int a, int b){return a + b;}

}

このコードでは、MainメソッドからShowTitleAddを順番に呼び出しています。

Mainstaticメソッドであるため、インスタンスを作らずに直接呼び出すメソッドもstaticとして定義しています。

5. C#メソッドの引数の使い方

5-1. 引数とは何か

引数とは、メソッドへ渡す値のことです。メソッドを定義するときに記述する変数は、厳密には「パラメーター」または「仮引数」と呼ばれます。呼び出すときに実際に渡す値は「実引数」と呼ばれます。

static void ShowPrice(int price){Console.WriteLine($"価格は{price}円です");}

ShowPrice(1000);

この例では、定義側のpriceがパラメーターで、呼び出し側の1000が実際に渡される引数です。

引数を使うと、メソッドの外部から値を受け取り、その値に応じた処理を実行できます。

5-2. 複数の引数を渡す方法

複数の引数を使う場合は、定義側と呼び出し側の両方でカンマ区切りにします。

static void ShowUser(string name, int age){Console.WriteLine($"名前:{name}");Console.WriteLine($"年齢:{age}");}

ShowUser("鈴木", 25);

通常は、定義された順番に合わせて値を渡します。

static int Subtract(int a, int b){return a - b;}

int result = Subtract(10, 3);

この場合、a10b3が渡されるため、結果は7です。

引数の順番を入れ替えると結果が変わる場合があるため、注意が必要です。

5-3. デフォルト引数

C#では、引数に既定値を設定できます。これを省略可能な引数と呼びます。

static void ShowGreeting(string name = "ゲスト"){Console.WriteLine($"こんにちは、{name}さん");}

引数を省略すると、既定値が使われます。

ShowGreeting();       // こんにちは、ゲストさんShowGreeting("佐藤"); // こんにちは、佐藤さん

複数の引数がある場合、省略可能な引数は、基本的に必須の引数より後ろへ配置します。

static decimal CalculatePrice(decimal price, decimal taxRate = 0.1m){return price * (1 + taxRate);}

5-4. 名前付き引数

名前付き引数を使うと、引数名を明示して値を渡せます。

static void CreateUser(string name, int age, bool isAdmin){Console.WriteLine($"{name}, {age}, 管理者:{isAdmin}");}

CreateUser(name: "高橋", age: 30, isAdmin: false);

引数名を指定するため、何の値を渡しているのかがわかりやすくなります。

また、名前付き引数を使えば、引数の順番を変えて指定することもできます。

CreateUser(isAdmin: false, age: 30, name: "高橋");

ただし、読みやすさを損なうような不規則な並び方は避け、必要な場面で使用しましょう。

5-5. ref引数とout引数

通常、値型の引数をメソッドへ渡すと、値がコピーされます。そのため、メソッド内で引数を書き換えても、呼び出し元の変数には影響しません。

refを使うと、呼び出し元の変数そのものをメソッド内で変更できます。

static void DoubleValue(ref int number){number *= 2;}

int value = 10;DoubleValue(ref value);

Console.WriteLine(value); // 20

refで渡す変数は、呼び出す前に初期化されている必要があります。

一方、outは、メソッドから値を受け取るために使われます。

static void GetUserData(out string name, out int age){name = "山田";age = 28;}

GetUserData(out string userName, out int userAge);

Console.WriteLine(userName);Console.WriteLine(userAge);

out引数は、メソッド内で必ず値を代入しなければなりません。呼び出す前の初期化は不要です。

文字列を整数に変換できるか調べるint.TryParseも、outを使う代表的な例です。

bool success = int.TryParse("123", out int number);

if (success){Console.WriteLine(number);}

5-6. paramsを使った可変長引数

paramsを使うと、渡す値の個数が決まっていないメソッドを定義できます。

static int Sum(params int[] numbers){int total = 0;

foreach (int number in numbers){total += number;}return total;

}

呼び出すときは、任意の個数の値を渡せます。

Console.WriteLine(Sum(1, 2));Console.WriteLine(Sum(1, 2, 3, 4, 5));Console.WriteLine(Sum());

配列を直接渡すこともできます。

int[] values = { 10, 20, 30 };int result = Sum(values);

原則として、paramsを付けた引数は引数リストの最後に置き、1つのメソッドに1つだけ指定します。

6. C#メソッドの戻り値の使い方

6-1. return文の基本

return文は、メソッドから呼び出し元へ値を返すために使います。

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

戻り値の型と、実際に返す値の型は一致している必要があります。

static string GetName(){return "田中";}

次のように、戻り値の型と異なる値を返すとコンパイルエラーになります。

static int GetNumber(){// return "100"; // stringなのでエラーreturn 100;}

6-2. 戻り値を変数に代入する方法

メソッドから返された値は、変数へ代入して利用できます。

static double CalculateAverage(double a, double b){return (a + b) / 2;}

double average = CalculateAverage(80, 90);Console.WriteLine(average);

戻り値をそのまま別のメソッドへ渡すこともできます。

Console.WriteLine(CalculateAverage(80, 90));

さらに、戻り値を式の一部として使用することも可能です。

double total = CalculateAverage(80, 90) + 10;

6-3. 条件によって戻り値を変える方法

if文などを使い、条件によって異なる値を返せます。

static string GetResultMessage(int score){if (score >= 80){return "合格です";}else{return "不合格です";}}

より簡潔に書くこともできます。

static string GetResultMessage(int score){if (score >= 80){return "合格です";}

return "不合格です";

}

returnが実行されると、その時点でメソッドの処理は終了します。

6-4. 複数の値を返したい場合の考え方

通常のreturnで直接返せる値は1つです。ただし、タプル、クラス、構造体、配列、out引数などを使えば、複数の情報をまとめて返せます。

タプルを使う例は次のとおりです。

static (int Min, int Max) GetMinMax(int a, int b){if (a < b){return (a, b);}

return (b, a);

}

呼び出し側では、次のように受け取れます。

(int min, int max) = GetMinMax(10, 3);

Console.WriteLine($"最小値:{min}");Console.WriteLine($"最大値:{max}");

関連する複数の情報を本格的に扱う場合は、専用のクラスや構造体を作る方法もあります。

class UserResult{public string Name { get; set; } = "";public int Age { get; set; }}

static UserResult GetUser(){return new UserResult{Name = "佐藤",Age = 25};}

6-5. return文で処理を終了する方法

returnは値を返すだけでなく、メソッドの処理を終了する役割も持ちます。

static void RegisterUser(string name){if (string.IsNullOrWhiteSpace(name)){Console.WriteLine("名前を入力してください");return;}

Console.WriteLine($"{name}さんを登録しました");

}

このように、処理を続けられない条件を先に確認して終了する書き方は、コードの入れ子を浅くするのに役立ちます。

戻り値のあるメソッドでは、終了するときに戻り値を指定します。

static int Divide(int a, int b){if (b == 0){return 0;}

return a / b;

}

実際には、0で割れないことを呼び出し元へ明確に伝えるため、例外を投げたり、成功したかどうかを別の値で返したりする設計も検討します。

7. C#メソッドの種類

7-1. staticメソッド

staticメソッドは、インスタンスではなくクラス自体に属するメソッドです。

class MathHelper{public static int Square(int number){return number * number;}}

インスタンスを作成せず、クラス名から呼び出せます。

int result = MathHelper.Square(5);

staticメソッドは、特定のオブジェクトが持つ状態に依存しない処理に向いています。数値計算、文字列変換、入力値の検証などが代表例です。

7-2. インスタンスメソッド

インスタンスメソッドは、作成されたオブジェクトに属するメソッドです。

class BankAccount{private decimal balance;

public void Deposit(decimal amount){balance += amount;}public decimal GetBalance(){return balance;}

}

利用するときはインスタンスを作成します。

BankAccount account = new BankAccount();

account.Deposit(5000);Console.WriteLine(account.GetBalance());

インスタンスメソッドでは、そのインスタンスが持つフィールドやプロパティへアクセスできます。

7-3. コンストラクタ

コンストラクタは、クラスのインスタンスを作成するときに実行される特別な処理です。

class User{public string Name { get; }

public User(string name){Name = name;}

}

次のようにnewでインスタンスを作成すると、コンストラクタが呼び出されます。

User user = new User("山田");Console.WriteLine(user.Name);

コンストラクタには戻り値の型を書かず、クラス名と同じ名前を付けます。一般的なメソッドとは異なりますが、クラスの初期化を担当する重要な仕組みです。

7-4. オーバーロード

オーバーロードとは、同じ名前で引数の構成が異なるメソッドを複数定義することです。

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

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

}

呼び出すときは、渡された引数の数や型に対応するメソッドが選ばれます。

Calculator calculator = new Calculator();

Console.WriteLine(calculator.Add(1, 2));Console.WriteLine(calculator.Add(1, 2, 3));Console.WriteLine(calculator.Add(1.5, 2.5));

戻り値の型だけを変えても、オーバーロードにはなりません。

// 引数が同じで戻り値だけが異なるため定義できない// int GetValue() { return 1; }// string GetValue() { return "1"; }

7-5. 非同期メソッド

非同期メソッドは、時間のかかる処理の完了を待つ間に、実行中のスレッドを不要に占有しないようにするためのメソッドです。ファイル操作、通信処理、データベースアクセスなどでよく使われます。

一般的には、asyncawaitを使用します。

static async Task ShowMessageAsync(){await Task.Delay(1000);Console.WriteLine("1秒後に表示しました");}

呼び出し側でもawaitを使います。

static async Task Main(){await ShowMessageAsync();}

値を返す非同期メソッドでは、Task<T>を戻り値の型にします。

static async Task<int> GetNumberAsync(){await Task.Delay(1000);return 100;}

呼び出し方は次のとおりです。

int number = await GetNumberAsync();

非同期メソッドの名前には、処理内容が非同期であることを示すため、末尾にAsyncを付けるのが一般的です。

7-6. ラムダ式との違い

ラムダ式は、名前を持たない処理を簡潔に記述するための構文です。

通常のメソッドは、次のように定義します。

static int Square(int number){return number * number;}

同じ処理をラムダ式で表すと、次のように書けます。

Func<int, int> square = number => number * number;

Console.WriteLine(square(5));

通常のメソッドは、名前を付けてクラスなどのメンバーとして定義します。一方、ラムダ式は、変数へ代入したり、別のメソッドへ処理として渡したりする場面に向いています。

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };List<int> evenNumbers = numbers.Where(number => number % 2 == 0).ToList();

複数の場所から再利用する重要な処理は通常のメソッドにし、その場だけで使う短い処理はラムダ式にするなど、用途に応じて使い分けます。

8. C#メソッドを使う実践例

8-1. 文字列を表示するメソッド

受け取った名前を使って、メッセージを表示する例です。

class Program{static void Main(){ShowWelcomeMessage("山田");}

static void ShowWelcomeMessage(string name){Console.WriteLine($"{name}さん、ようこそ");}

}

表示処理をメソッドへ分けることで、Mainメソッドには処理の流れだけを記述できます。

8-2. 数値を計算するメソッド

商品の単価と個数を受け取り、合計金額を返すメソッドです。

class Program{static void Main(){int total = CalculateTotal(1200, 3);Console.WriteLine($"合計金額:{total}円");}

static int CalculateTotal(int unitPrice, int quantity){return unitPrice * quantity;}

}

計算処理をメソッド化すると、ほかの画面や処理からも再利用できます。

8-3. 条件判定を行うメソッド

年齢を受け取り、成人かどうかを判定する例です。

class Program{static void Main(){bool isAdult = IsAdult(20);

    if (isAdult){Console.WriteLine("成人です");}else{Console.WriteLine("未成年です");}}static bool IsAdult(int age){return age &gt;= 18;}

}

真か偽かを返すメソッド名には、IsHasCanなどを付けると意味が伝わりやすくなります。

IsAdult()HasPermission()CanLogin()

8-4. 配列やリストを処理するメソッド

整数のリストを受け取り、合計値を返す例です。

class Program{static void Main(){List<int> scores = new List<int> { 80, 75, 90 };

    int total = CalculateTotalScore(scores);Console.WriteLine($"合計点:{total}");}static int CalculateTotalScore(List&lt;int&gt; scores){int total = 0;foreach (int score in scores){total += score;}return total;}

}

平均値を求める場合は、次のようなメソッドを追加できます。

static double CalculateAverage(List<int> scores){if (scores.Count == 0){return 0;}

int total = CalculateTotalScore(scores);return (double)total / scores.Count;

}

既存のCalculateTotalScoreを再利用することで、合計を求めるコードの重複を避けています。

8-5. クラスを分けてメソッドを呼び出す例

計算を担当するクラスと、プログラムの実行を担当するクラスを分ける例です。

class PriceCalculator{public decimal CalculateSubtotal(decimal unitPrice, int quantity){return unitPrice * quantity;}

public decimal CalculateTax(decimal subtotal, decimal taxRate){return subtotal * taxRate;}public decimal CalculateTotal(decimal unitPrice, int quantity, decimal taxRate){decimal subtotal = CalculateSubtotal(unitPrice, quantity);decimal tax = CalculateTax(subtotal, taxRate);return subtotal + tax;}

}

class Program{static void Main(){PriceCalculator calculator = new PriceCalculator();

    decimal total = calculator.CalculateTotal(unitPrice: 1000m,quantity: 3,taxRate: 0.1m);Console.WriteLine($"税込合計:{total}円");}

}

クラスごとに役割を分けることで、計算処理をほかの場所から再利用しやすくなります。

9. C#メソッドでよくあるエラーと対処法

9-1. メソッド名のスペルミス

定義したメソッド名と呼び出し側の名前が一致していないと、メソッドを見つけられません。

static void ShowMessage(){Console.WriteLine("メッセージ");}

static void Main(){// ShowMessege(); // スペルが異なるShowMessage();}

C#では大文字と小文字も区別されます。

ShowMessage();showMessage(); // 別の名前として扱われる

エラーが発生したら、メソッド名のスペルと大文字・小文字を確認しましょう。

9-2. 引数の数や型が合わない

定義された引数と、呼び出し時に渡す値の数や型が合わない場合はエラーになります。

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

// Add(10); // 引数が足りない// Add(10, 20, 30); // 引数が多い// Add("10", "20"); // 型が異なる

正しくは、int型の値を2つ渡します。

int result = Add(10, 20);

文字列を数値へ変換する場合は、int.TryParseなどを使って変換できるか確認します。

9-3. 戻り値が必要なのにreturnしていない

戻り値の型にvoid以外を指定した場合、すべての実行経路で適切な値を返す必要があります。

static string GetResult(int score){if (score >= 80){return "合格";}

// scoreが80未満の場合のreturnがないためエラー

}

すべての条件で値を返すように修正します。

static string GetResult(int score){if (score >= 80){return "合格";}

return "不合格";

}

9-4. staticとインスタンスの使い分けミス

staticメソッドからインスタンスメソッドを直接呼び出すことはできません。

class Program{static void Main(){// ShowMessage(); // インスタンスがないため呼び出せない}

void ShowMessage(){Console.WriteLine("メッセージ");}

}

インスタンスを作成して呼び出します。

class Program{static void Main(){Program program = new Program();program.ShowMessage();}

void ShowMessage(){Console.WriteLine("メッセージ");}

}

オブジェクトの状態を使わない処理であれば、呼び出される側をstaticにする方法もあります。

static void ShowMessage(){Console.WriteLine("メッセージ");}

9-5. アクセス修飾子によって呼び出せない

privateメソッドは、定義されたクラスの外部から呼び出せません。

class MessageService{private void ShowMessage(){Console.WriteLine("メッセージ");}}

class Program{static void Main(){MessageService service = new MessageService();

    // service.ShowMessage();// privateなので呼び出せない}

}

外部から呼び出す必要がある場合は、publicに変更します。

class MessageService{public void ShowMessage(){Console.WriteLine("メッセージ");}}

ただし、すべてのメソッドを無条件にpublicにするのは避けましょう。クラスの内部だけで使う補助的な処理は、privateにして外部へ公開しないほうが安全です。

10. C#メソッドを書くときの注意点

10-1. 1つのメソッドに1つの役割を持たせる

1つのメソッドには、できるだけ1つの明確な役割を持たせましょう。

たとえば、ユーザー情報の入力、検証、保存、メール送信を1つのメソッドにまとめると、処理が複雑になります。

void RegisterUser(){// 入力// 検証// 保存// メール送信}

役割ごとに分けると、処理内容がわかりやすくなります。

void RegisterUser(){User user = ReadUserInput();ValidateUser(user);SaveUser(user);SendWelcomeEmail(user);}

処理を分けることで、個別の修正や動作確認もしやすくなります。

10-2. わかりやすいメソッド名にする

メソッド名を見ただけで、何をする処理なのか想像できることが理想です。

CalculateTotalPrice()FindUserById()ValidateEmailAddress()SaveOrder()

次のような名前は、目的がわかりにくくなります。

DoWork()Run()Execute2()Data()

また、値を取得するならGet、保存するならSave、削除するならDeleteなど、動詞から始めると処理を表しやすくなります。

10-3. 長すぎるメソッドを避ける

メソッドが長くなりすぎると、処理の流れを追いにくくなります。

特に、次のような状態になったら分割を検討しましょう。

  • 複数の異なる処理を行っている

  • 条件分岐や繰り返しが何重にもなっている

  • 同じような処理が複数回登場する

  • メソッド名だけでは処理全体を説明できない

  • 画面を大きくスクロールしないと全体を読めない

ただし、行数だけを基準に機械的に分割する必要はありません。処理の役割や読みやすさを基準に判断することが大切です。

10-4. 重複コードをメソッド化する

同じ処理を何度も書いている場合は、共通メソッドにまとめられないか検討します。

Console.WriteLine("--------------------");Console.WriteLine("商品一覧");Console.WriteLine("--------------------");

Console.WriteLine("--------------------");Console.WriteLine("注文一覧");Console.WriteLine("--------------------");

区切り線の表示をメソッドへまとめると、重複を減らせます。

static void ShowHeading(string title){Console.WriteLine("--------------------");Console.WriteLine(title);Console.WriteLine("--------------------");}

ShowHeading("商品一覧");ShowHeading("注文一覧");

ただし、偶然似ているだけで意味が異なる処理を無理に共通化すると、かえって修正しにくくなる場合があります。処理の目的が本当に共通しているかを確認しましょう。

10-5. コメントを適切に書く

コメントは、コードを読んだだけではわかりにくい理由や背景を説明するために使います。

次のように、コードの内容をそのまま日本語にしただけのコメントは、あまり役立ちません。

// totalにpriceを足すtotal += price;

なぜその処理が必要なのかを書くと、後から読んだときに理解しやすくなります。

// キャンペーン対象外の商品も請求額には含めるtotal += price;

メソッド名や変数名をわかりやすくし、コードだけで意図が伝わるようにすることも重要です。コメントを書かないと理解できないほど複雑なメソッドは、処理の分割や命名の見直しも検討しましょう。

11. C#メソッドに関するよくある質問

11-1. C#のメソッドと関数は同じ?

どちらも、処理をひとまとまりにしたものという点ではほぼ同じです。

ただし、一般的には、クラスや構造体などの型に属する関数をメソッドと呼びます。C#では、処理をクラスなどの中に定義するため、「メソッド」という表現が基本です。

学習サイトや会話の中で「C#の関数」と表現されている場合も、多くはメソッドを指しています。

11-2. voidは何を意味する?

voidは、そのメソッドが呼び出し元へ値を返さないことを意味します。

static void ShowMessage(){Console.WriteLine("こんにちは");}

このメソッドは文字列を表示しますが、呼び出し元へ計算結果などを返しません。

値を返したい場合は、voidではなく、返す値に対応する型を指定します。

static string GetMessage(){return "こんにちは";}

11-3. staticメソッドはいつ使う?

staticメソッドは、特定のインスタンスが持つ状態を使わず、入力値だけで処理できる場合などに適しています。

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

一方、口座残高やユーザー名など、オブジェクトごとの状態を使う処理は、インスタンスメソッドにするのが自然です。

class BankAccount{public decimal Balance { get; private set; }

public void Deposit(decimal amount){Balance += amount;}

}

単にインスタンス作成を省略したいという理由だけで、すべてのメソッドをstaticにするのは避けましょう。

11-4. メソッド名は日本語でも書ける?

C#では、技術的には日本語をメソッド名に使用できます。

static void 挨拶を表示する(){Console.WriteLine("こんにちは");}

呼び出し方は次のとおりです。

挨拶を表示する();

ただし、一般的な開発現場では英語のメソッド名が使われます。開発ツール、ライブラリ、ドキュメントとの統一性や、チーム内での共有を考えると、英語で命名するのが無難です。

static void ShowGreeting(){Console.WriteLine("こんにちは");}

11-5. メソッドはいくつまで作れる?

通常の開発で意識するような、単純な個数制限はありません。必要に応じて、多数のメソッドを定義できます。

ただし、1つのクラスに大量のメソッドが集まっている場合、そのクラスが多くの役割を持ちすぎている可能性があります。

たとえば、ユーザー管理、商品管理、注文処理、メール送信をすべて1つのクラスに入れるのではなく、役割ごとにクラスを分けると整理しやすくなります。

class UserService{public void RegisterUser(){}}

class OrderService{public void CreateOrder(){}}

class EmailService{public void SendEmail(){}}

メソッドの数そのものよりも、各クラスと各メソッドの役割が明確かどうかを重視しましょう。

まとめ

C#のメソッドは、特定の処理をひとまとまりにして、名前を付けて再利用するための仕組みです。

基本的なメソッドは、アクセス修飾子、戻り値の型、メソッド名、引数リスト、処理本体で構成されます。

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

値を受け取る場合は引数を使い、処理結果を返す場合は戻り値とreturn文を使います。値を返さない場合は、戻り値の型にvoidを指定します。

また、C#のメソッドには、クラス自体に属するstaticメソッドや、オブジェクトごとの状態を扱うインスタンスメソッド、非同期処理を行うメソッドなどがあります。

メソッドを書くときは、1つのメソッドに1つの役割を持たせ、処理内容が伝わる名前を付けることが大切です。同じコードが繰り返されている場合は、共通処理としてメソッド化できないか検討しましょう。

最初は、引数なし・戻り値なしの簡単なメソッドから始め、次に引数や戻り値を追加していくと理解しやすくなります。実際にコードを書きながら、メソッドの定義と呼び出しを繰り返し練習することが、C#を身につける近道です。