C#のメソッドとは?定義・呼び出し・戻り値・引数を初心者向けにわかりやすく解説
C#のメソッドとは?定義・呼び出し・戻り値・引数を初心者向けにわかりやすく解説
はじめに
C#でプログラムを作るうえで欠かせないのが「メソッド」です。画面に文字を表示する、数値を計算する、入力内容をチェックする、データを保存するといった処理は、メソッドとしてまとめられます。
メソッドを使うと、同じ処理を何度も書く必要がなくなり、プログラムを読みやすく整理できます。しかし、C#を学び始めたばかりの段階では、次のような疑問を持つことも少なくありません。
メソッドはどのように定義するのか
voidやreturnにはどのような意味があるのか引数と戻り値は何が違うのか
staticを付ける場合と付けない場合は何が違うのか定義したメソッドをどのように呼び出すのか
この記事では、C#のメソッドについて、基本構文から引数、戻り値、オーバーロード、非同期メソッドまで、初心者向けに順を追って解説します。
1. C#のメソッドとは?
1-1. メソッドの意味と役割
C#のメソッドとは、特定の処理をひとまとまりにしたものです。
たとえば、「2つの数値を足す」という処理は、次のようなメソッドとして定義できます。
static int Add(int number1, int number2){return number1 + number2;}このメソッドには、次の情報が含まれています。
メソッド名:
Add受け取る値:
number1とnumber2実行する処理:2つの値を加算する
返す値:加算結果
一度メソッドを定義しておけば、必要な場所から何度でも呼び出せます。
int result1 = Add(10, 20);int result2 = Add(5, 8);Console.WriteLine(result1); // 30Console.WriteLine(result2); // 13
メソッドは、長いプログラムを役割ごとの小さな処理に分割するための重要な仕組みです。
1-2. C# methodと関数の違い
プログラミングでは、「メソッド」と「関数」という言葉が使われます。
一般的に、関数は入力を受け取って処理を行い、必要に応じて結果を返す仕組み全般を指します。一方、メソッドはクラスや構造体などに所属する関数です。
C#では、通常の処理はクラスなどの型の内部に定義します。
class Calculator{public int Add(int a, int b){return a + b;}}この例のAddは、Calculatorクラスに所属しているため、関数というより「メソッド」と呼ぶのが一般的です。
ただし、日常的な説明では、メソッドと関数がほぼ同じ意味で使われることもあります。C#を学ぶ際は、「クラスなどの中に定義された処理がメソッド」と理解しておけばよいでしょう。
1-3. メソッドを使うメリット
メソッドを使う主なメリットは、処理を再利用できることです。
たとえば、商品の税込価格を計算する処理を複数の場所で使用するとします。計算式を毎回直接書くと、税率を変更するときにすべての場所を修正しなければなりません。
int price1 = 1000;double total1 = price1 * 1.1;int price2 = 2000;double total2 = price2 * 1.1;
計算処理をメソッドにまとめれば、修正箇所を1か所にできます。
static double CalculateTaxIncludedPrice(int price){return price * 1.1;}double total1 = CalculateTaxIncludedPrice(1000);double total2 = CalculateTaxIncludedPrice(2000);
メソッドには、ほかにも次のようなメリットがあります。
重複したコードを減らせる
プログラムの流れを読みやすくできる
処理ごとにテストしやすくなる
不具合が発生した場所を特定しやすくなる
複数人で役割を分担しやすくなる
1-4. メソッドが使われる具体例
C#のメソッドは、さまざまな処理に使われます。
代表的な例は次のとおりです。
// メッセージを表示するstatic void ShowMessage(){Console.WriteLine("処理を開始します。");}// 合計を計算するstatic int Add(int a, int b){return a + b;}
// 入力内容が正しいか確認するstatic bool IsValidAge(int age){return age >= 0 && age <= 150;}
// 名前を整形するstatic string CreateGreeting(string name){return $"こんにちは、{name}さん。";}
実際のアプリケーションでは、ログイン処理、データベースへの保存、ファイルの読み書き、API通信、画面表示などもメソッドとして実装されます。
2. C#メソッドの基本構文
2-1. メソッド定義の書き方
C#のメソッドは、基本的に次の形式で定義します。
アクセス修飾子 戻り値の型 メソッド名(引数リスト){実行する処理}具体例を見てみましょう。
public int Add(int a, int b){int result = a + b;return result;}各部分の意味は次のとおりです。
public:どこからメソッドを利用できるかを指定するint:メソッドが返す値の型を指定するAdd:メソッドの名前int a, int b:メソッドが受け取る引数{ }:実際に実行する処理return result;:呼び出し元へ結果を返す
メソッドがクラス自体に所属する場合は、staticを追加します。
public static int Add(int a, int b){return a + b;}2-2. アクセス修飾子とは
アクセス修飾子は、メソッドをどこから呼び出せるかを指定するキーワードです。
初心者が最初に覚えておきたいものは、publicとprivateです。
public void PublicMethod(){Console.WriteLine("クラスの外部から呼び出せます。");}private void PrivateMethod(){Console.WriteLine("基本的に同じクラスの内部からだけ呼び出せます。");}
主なアクセス修飾子には次のものがあります。
| アクセス修飾子 | 概要 |
|---|---|
public | どこからでもアクセスできる |
private | 同じクラス内からアクセスできる |
protected | 同じクラスと派生クラスからアクセスできる |
internal | 同じアセンブリ内からアクセスできる |
protected internal | 同じアセンブリ内、または派生クラスからアクセスできる |
private protected | 同じアセンブリ内にある派生クラスからアクセスできる |
クラスの内部でのみ使う補助的なメソッドには、privateを指定するのが基本です。外部に公開する必要があるメソッドだけをpublicにすると、クラスの使い方がわかりやすくなります。
2-3. 戻り値の型とは
戻り値の型は、メソッドが呼び出し元に返すデータの種類です。
整数を返す場合はintを指定します。
static int GetNumber(){return 100;}文字列を返す場合はstringを指定します。
static string GetMessage(){return "こんにちは";}真偽値を返す場合はboolを指定します。
static bool IsAdult(int age){return age >= 18;}値を返さない場合は、戻り値の型にvoidを指定します。
static void ShowMessage(){Console.WriteLine("メッセージを表示しました。");}戻り値の型と、returnで返す値の型は一致している必要があります。
2-4. メソッド名の付け方
C#では、メソッド名にPascalCaseを使うのが一般的です。PascalCaseとは、単語の先頭を大文字にしてつなげる命名方法です。
CalculateTotalPrice()GetUserName()SaveFile()CheckPassword()メソッド名には、処理内容が伝わる動詞または動詞を含む名前を付けましょう。
わかりにくい例は次のとおりです。
void Data(){}Dataだけでは、データを取得するのか、保存するのか、削除するのか判断できません。
処理内容に合わせて、次のような名前にするとわかりやすくなります。
void SaveData(){}void DeleteData(){}
string LoadData(){return "データ";}
2-5. 引数リストの基本
引数リストには、メソッドが受け取る値の型と名前を記述します。
static void ShowUser(string name, int age){Console.WriteLine($"名前:{name}");Console.WriteLine($"年齢:{age}");}複数の引数を定義するときは、カンマで区切ります。
ShowUser("田中", 25);引数を受け取らない場合は、丸括弧の中を空にします。
static void ShowTitle(){Console.WriteLine("ユーザー情報");}3. C#メソッドの定義方法
3-1. 戻り値がないvoidメソッド
処理を実行するだけで、呼び出し元に値を返す必要がない場合はvoidメソッドを定義します。
static void SayHello(){Console.WriteLine("こんにちは");}呼び出すときは、メソッド名の後ろに丸括弧を付けます。
SayHello();voidメソッドは、画面への表示、データの保存、状態の更新などに使われます。
static void PrintLine(){Console.WriteLine("--------------------");}voidメソッドでも、処理を途中で終了するために値を伴わないreturnを書くことは可能です。
static void ShowPositiveNumber(int number){if (number <= 0){return;}Console.WriteLine(number);
}
3-2. 戻り値があるメソッド
呼び出し元へ結果を返したい場合は、戻り値の型を指定してreturn文を使用します。
static int Multiply(int a, int b){return a * b;}このメソッドを呼び出すと、計算結果を受け取れます。
int result = Multiply(4, 5);Console.WriteLine(result); // 20文字列を返すメソッドも定義できます。
static string CreateFullName(string lastName, string firstName){return $"{lastName} {firstName}";}string fullName = CreateFullName("山田", "太郎");Console.WriteLine(fullName);3-3. 引数なしメソッド
外部から値を受け取る必要がない場合は、引数なしメソッドを定義します。
static DateTime GetCurrentTime(){return DateTime.Now;}呼び出し時にも引数は指定しません。
DateTime currentTime = GetCurrentTime();Console.WriteLine(currentTime);丸括弧は省略できない点に注意してください。
GetCurrentTime(); // 正しい3-4. 引数ありメソッド
呼び出し元から値を受け取って処理するときは、引数ありメソッドを定義します。
static double CalculateArea(double width, double height){return width * height;}呼び出し時には、定義された順番に値を渡します。
double area = CalculateArea(5.0, 3.0);Console.WriteLine(area); // 15引数を利用すると、同じ処理を異なるデータに対して実行できます。
Console.WriteLine(CalculateArea(2.0, 4.0));Console.WriteLine(CalculateArea(10.0, 8.0));3-5. staticメソッドの定義
staticメソッドは、特定のインスタンスではなく、クラス自体に所属するメソッドです。
class Calculator{public static int Add(int a, int b){return a + b;}}staticメソッドは、クラス名を使って呼び出せます。
int result = Calculator.Add(10, 5);インスタンスを作成する必要はありません。
一方、staticを付けないメソッドはインスタンスメソッドです。
class Counter{private int _count;public void Increment(){_count++;}public int GetCount(){return _count;}
}
インスタンスメソッドは、オブジェクトごとの状態を操作するときに使われます。
4. C#メソッドの呼び出し方法
4-1. メソッド呼び出しの基本
メソッドは、基本的に次の形式で呼び出します。
メソッド名(引数);戻り値がある場合は、変数へ代入できます。
int result = Add(3, 7);戻り値を直接別のメソッドへ渡すこともできます。
Console.WriteLine(Add(3, 7));呼び出し結果を使用しないこともできますが、必要な結果を返すメソッドであれば、変数に保存するか別の処理に渡すのが一般的です。
4-2. 同じクラス内のメソッドを呼び出す
同じクラス内にあるメソッドは、通常、メソッド名だけで呼び出せます。
class GreetingService{public void ShowGreeting(){string message = CreateMessage("佐藤");Console.WriteLine(message);}private string CreateMessage(string name){return $"こんにちは、{name}さん。";}
}
ShowGreetingから、同じクラス内のCreateMessageを呼び出しています。
インスタンスメソッドから同じインスタンスのメソッドを呼ぶ場合、次のようにthisを付けることもできます。
string message = this.CreateMessage("佐藤");ただし、明確であればthisは省略できます。
4-3. 別クラスのメソッドを呼び出す
別クラスのインスタンスメソッドを呼び出すには、対象クラスのインスタンスを作成します。
class Calculator{public int Add(int a, int b){return a + b;}}Calculator calculator = new Calculator();int result = calculator.Add(10, 20);Console.WriteLine(result);
new Calculator()でインスタンスを作り、変数calculatorを通してAddメソッドを呼び出しています。
呼び出すメソッドがpublicでなければ、通常は別クラスからアクセスできません。
4-4. staticメソッドを呼び出す
staticメソッドは、クラス名に続けて呼び出します。
class MathHelper{public static int Square(int number){return number * number;}}int result = MathHelper.Square(5);Console.WriteLine(result); // 25C#標準ライブラリにも、多くのstaticメソッドがあります。
int maximum = Math.Max(10, 20);double squareRoot = Math.Sqrt(16);int number = int.Parse("123");4-5. インスタンスメソッドを呼び出す
インスタンスメソッドは、作成したオブジェクトに対して呼び出します。
class Person{public string Name { get; set; } = "";public void Introduce(){Console.WriteLine($"私の名前は{Name}です。");}
}
Person person = new Person();person.Name = "鈴木";person.Introduce();インスタンスメソッドでは、そのオブジェクトが持つフィールドやプロパティを利用できます。
複数のインスタンスを作れば、それぞれ異なる状態を持たせられます。
Person person1 = new Person { Name = "鈴木" };Person person2 = new Person { Name = "高橋" };person1.Introduce();person2.Introduce();
5. C#メソッドの戻り値
5-1. 戻り値とは何か
戻り値とは、メソッドが処理結果として呼び出し元へ返す値です。
static int GetPrice(){return 1200;}このメソッドを呼び出すと、1200という値を受け取れます。
int price = GetPrice();戻り値を利用すると、メソッドで計算した結果や取得したデータを、その後の処理に使えます。
5-2. return文の使い方
return文は、メソッドの実行を終了し、呼び出し元へ値を返します。
static int Subtract(int a, int b){return a - b;}条件によって異なる値を返すこともできます。
static string GetResultMessage(int score){if (score >= 60){return "合格";}return "不合格";
}
returnが実行されると、その後に書かれた処理は実行されません。
static int GetNumber(){return 10;// ここには到達できない
}
5-3. 戻り値を変数に代入する方法
戻り値は、対応する型の変数に代入します。
static double CalculateAverage(double a, double b){return (a + b) / 2;}double average = CalculateAverage(80, 90);Console.WriteLine(average);戻り値を条件式で利用することもできます。
static bool IsEven(int number){return number % 2 == 0;}if (IsEven(10)){Console.WriteLine("偶数です。");}5-4. 複数の値を返したい場合
C#のメソッドで複数の値を返したい場合は、タプルを利用できます。
static (int Min, int Max) GetMinMax(int a, int b){int min = Math.Min(a, b);int max = Math.Max(a, b);return (min, max);
}
呼び出し側では、次のように受け取れます。
(int min, int max) = GetMinMax(10, 30);Console.WriteLine($"最小値:{min}");Console.WriteLine($"最大値:{max}");
次のように1つの変数で受け取ることもできます。
var result = GetMinMax(10, 30);Console.WriteLine(result.Min);Console.WriteLine(result.Max);
データが複雑な場合や、複数の処理で同じ形式を使う場合は、専用のクラスやrecordを戻り値にする方法もあります。
public record CalculationResult(int Sum, int Average);5-5. 戻り値でよくあるエラー
よくあるエラーの1つは、戻り値の型と実際に返す値の型が一致しないことです。
static int GetName(){return "山田"; // stringをintとして返せない}正しくは、戻り値の型をstringにします。
static string GetName(){return "山田";}戻り値が必要なメソッドで、値を返さない経路が存在する場合もエラーになります。
static int GetPrice(bool isMember){if (isMember){return 900;}// isMemberがfalseの場合のreturnがない
}
すべての経路で値を返すように修正します。
static int GetPrice(bool isMember){if (isMember){return 900;}return 1000;
}
6. C#メソッドの引数
6-1. 引数とは何か
引数とは、メソッドに渡すデータです。引数を使うことで、呼び出すたびに異なる値を処理できます。
static void ShowMessage(string message){Console.WriteLine(message);}ShowMessage("おはようございます");ShowMessage("処理が完了しました");同じShowMessageメソッドでも、渡す値によって表示内容を変更できます。
6-2. 仮引数と実引数の違い
メソッドの定義側に書く変数を「仮引数」、呼び出し側から渡す具体的な値を「実引数」と呼びます。
static void ShowUserName(string name){Console.WriteLine(name);}この例のnameが仮引数です。
ShowUserName("田中");この例の"田中"が実引数です。
呼び出されたとき、実引数の値が仮引数へ渡され、メソッド内で利用できるようになります。
6-3. 複数の引数を渡す方法
複数の引数を使用する場合は、定義側と呼び出し側でカンマ区切りにします。
static void ShowProduct(string name, int price, int stock){Console.WriteLine($"商品名:{name}");Console.WriteLine($"価格:{price}円");Console.WriteLine($"在庫:{stock}個");}ShowProduct("キーボード", 5000, 10);基本的には、定義された順番に合わせて値を渡します。
ShowProduct("キーボード", 5000, 10); // 正しいShowProduct(5000, "キーボード", 10); // 型と順番が違う6-4. デフォルト引数の使い方
引数に初期値を指定すると、その引数を省略できるようになります。これを省略可能な引数、またはデフォルト引数と呼びます。
static void Greet(string name, string message = "こんにちは"){Console.WriteLine($"{message}、{name}さん。");}第2引数を省略すると、初期値が使われます。
Greet("山田");// こんにちは、山田さん。値を指定すれば、初期値の代わりに指定した値が使われます。
Greet("山田", "こんばんは");// こんばんは、山田さん。省略可能な引数は、通常、必須の引数より後ろに定義します。
static void PrintText(string text, int count = 1){for (int i = 0; i < count; i++){Console.WriteLine(text);}}6-5. 名前付き引数の使い方
名前付き引数を使うと、引数名を指定して値を渡せます。
static void CreateUser(string name, int age, string city){Console.WriteLine($"{name}, {age}, {city}");}通常の呼び出し方は次のとおりです。
CreateUser("佐藤", 30, "東京");名前付き引数を使うと、各値の意味が明確になります。
CreateUser(name: "佐藤", age: 30, city: "東京");すべてを名前付きで指定すれば、記述順を変更することもできます。
CreateUser(city: "東京", name: "佐藤", age: 30);引数が多い場合や、同じ型の引数が続く場合に有効です。
6-6. ref・out・paramsの基本
refを使うと、呼び出し元の変数そのものをメソッド内で変更できます。
static void DoubleValue(ref int number){number *= 2;}int value = 10;DoubleValue(ref value);Console.WriteLine(value); // 20
refへ渡す変数は、呼び出す前に値を設定しておく必要があります。
outは、メソッドから値を受け取るために使います。
static void GetValues(out int number, out string message){number = 100;message = "成功";}GetValues(out int number, out string message);Console.WriteLine(number);Console.WriteLine(message);
out引数には、メソッドが終了するまでに必ず値を代入する必要があります。
文字列を数値へ変換するint.TryParseでも、outが使われています。
bool success = int.TryParse("123", out int result);if (success){Console.WriteLine(result);}
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));paramsを付けられる引数は、基本的に引数リストの最後に1つだけです。
7. C#メソッドの種類と応用
7-1. staticメソッドとインスタンスメソッド
staticメソッドはクラス自体に所属し、インスタンスメソッドは作成したオブジェクトに所属します。
staticメソッドの例は次のとおりです。
class UnitConverter{public static double ToKilometers(double meters){return meters / 1000;}}double kilometers = UnitConverter.ToKilometers(5000);インスタンスメソッドの例は次のとおりです。
class BankAccount{public decimal Balance { get; private set; }public void Deposit(decimal amount){Balance += amount;}
}
BankAccount account = new BankAccount();account.Deposit(5000);Console.WriteLine(account.Balance);
オブジェクトごとの状態を使わない処理はstaticメソッド、オブジェクトの状態を参照または変更する処理はインスタンスメソッドにするのが基本です。
7-2. メソッドのオーバーロード
オーバーロードとは、同じ名前で引数の構成が異なるメソッドを複数定義する仕組みです。
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-3. コンストラクタとの違い
コンストラクタは、クラスのインスタンスを作成するときに実行される特別な処理です。
class User{public string Name { get; }public User(string name){Name = name;}
}
User user = new User("田中");コンストラクタと通常のメソッドには、次の違いがあります。
| 項目 | コンストラクタ | 通常のメソッド |
| 名前 | クラス名と同じ | 自由に付けられる |
| 戻り値の型 | 記述しない | voidやintなどを記述する |
| 実行時期 | インスタンス作成時 | 呼び出したとき |
| 主な役割 | 初期状態の設定 | 任意の処理 |
コンストラクタには、voidも書かない点が重要です。
7-4. 非同期メソッドの基本
時間がかかる処理を待っている間に、ほかの処理を進めたい場合は非同期メソッドを利用します。
非同期メソッドには、通常asyncを付け、戻り値にTaskまたはTask<T>を使用します。
static async Task ShowMessageAsync(){await Task.Delay(1000);Console.WriteLine("1秒経過しました。");}呼び出し側でもawaitを使用します。
await ShowMessageAsync();値を返す場合はTask<T>を使います。
static async Task<string> GetMessageAsync(){await Task.Delay(1000);return "処理が完了しました。";}string message = await GetMessageAsync();Console.WriteLine(message);非同期メソッド名には、Asyncを付けるのが一般的です。
原則として、イベントハンドラーなどの限られた用途を除き、async voidは避けます。呼び出し側が処理の完了を待ったり、例外を扱ったりしにくくなるためです。
7-5. ラムダ式との違い
ラムダ式は、名前を付けずに処理を簡潔に記述する方法です。
通常のメソッドは次のように定義します。
static int Square(int number){return number * number;}同じ処理をラムダ式で書くと、次のようになります。
Func<int, int> square = number => number * number;Console.WriteLine(square(5)); // 25通常のメソッドは、クラス内で再利用するまとまった処理に向いています。ラムダ式は、LINQやイベント処理など、一時的で短い処理に向いています。
int[] numbers = { 1, 2, 3, 4, 5 };int[] evenNumbers = numbers.Where(number => number % 2 == 0).ToArray();
処理が長く複雑になる場合は、ラムダ式へ詰め込まず、名前付きメソッドとして分離すると読みやすくなります。
8. 初心者がつまずきやすいC#メソッドのエラー
8-1. メソッド名のスペルミス
定義した名前と呼び出す名前が一致していないと、メソッドを見つけられません。
static void ShowMessage(){Console.WriteLine("こんにちは");}// ShowMesage(); // sが1つ足りない
C#では大文字と小文字も区別されます。
ShowMessage(); // 正しい// showMessage(); // 別の名前として扱われるエラーが出たら、メソッド名のスペルや大文字・小文字を確認しましょう。
8-2. 引数の数や型が違う
定義された引数と、呼び出し側の値が一致していない場合はエラーになります。
static int Add(int a, int b){return a + b;}// Add(10); // 引数が足りない// Add(10, 20, 30); // 引数が多い// Add("10", "20"); // 型が違う正しい呼び出し方は次のとおりです。
int result = Add(10, 20);文字列を数値として渡したい場合は、事前に変換が必要です。
int number1 = int.Parse("10");int number2 = int.Parse("20");int result = Add(number1, number2);
8-3. 戻り値の型が合わない
戻り値を受け取る変数の型が違う場合もエラーになります。
static string GetName(){return "田中";}// int name = GetName();
正しくは、string型で受け取ります。
string name = GetName();暗黙的に変換できる型であれば代入できる場合もあります。
static int GetNumber(){return 10;}double number = GetNumber();
ただし、型変換に頼りすぎると意図がわかりにくくなるため、戻り値に適した型を使用することが大切です。
8-4. staticとインスタンスの使い分けミス
staticメソッドから、インスタンスメソッドをそのまま呼び出すことはできません。
class Sample{public void InstanceMethod(){Console.WriteLine("インスタンスメソッド");}public static void StaticMethod(){// InstanceMethod(); // インスタンスがないため呼び出せない}
}
インスタンスを作成してから呼び出します。
public static void StaticMethod(){Sample sample = new Sample();sample.InstanceMethod();}反対に、staticメソッドはクラス名から呼び出します。
Sample.StaticMethod();8-5. スコープの理解不足
メソッド内で定義した変数は、基本的にそのメソッドの中でしか使えません。
static void CreateNumber(){int number = 100;}// Console.WriteLine(number); // メソッドの外からは使えない
さらに、ifやforなどのブロック内で定義した変数は、そのブロック内でのみ使用できます。
static void CheckNumber(int number){if (number > 0){string message = "正の数です";Console.WriteLine(message);}// Console.WriteLine(message); // ifブロックの外では使えない
}
複数のメソッドで共有したい状態は、クラスのフィールドやプロパティとして定義する方法があります。ただし、必要以上に共有するとプログラムの動作を追いにくくなるため、使用範囲はできるだけ狭くしましょう。
9. C#メソッドを書くときのベストプラクティス
9-1. 1つのメソッドに1つの役割を持たせる
1つのメソッドには、原則として1つの役割を持たせます。
たとえば、ユーザー情報を検証し、保存し、メールまで送信する処理を1つのメソッドに詰め込むと、変更やテストが難しくなります。
void RegisterUser(User user){ValidateUser(user);SaveUser(user);SendWelcomeEmail(user);}処理を分割すると、各メソッドの目的が明確になります。
bool ValidateUser(User user){// 入力内容を確認するreturn true;}void SaveUser(User user){// ユーザーを保存する}
void SendWelcomeEmail(User user){// メールを送る}
9-2. わかりやすいメソッド名にする
メソッド名を見ただけで、何をする処理なのかわかるようにします。
GetUserById()CalculateTotalPrice()SendOrderConfirmation()IsPasswordValid()Getは取得、Calculateは計算、Createは作成、Saveは保存、Deleteは削除といった形で動詞を使うと、役割が伝わりやすくなります。
真偽値を返すメソッドには、Is、Has、Canなどを使うと自然です。
bool IsAdult(int age){return age >= 18;}bool HasStock(int stock){return stock > 0;}
9-3. 長すぎるメソッドを避ける
メソッドが長すぎると、何をしているのか理解しにくくなります。
次のように複数の段階がある処理は、小さなメソッドへ分割します。
void ProcessOrder(Order order){ValidateOrder(order);CalculateOrderTotal(order);SaveOrder(order);SendOrderConfirmation(order);}分割したメソッド名が処理の説明になるため、コメントを大量に書かなくても全体の流れを把握しやすくなります。
行数だけで機械的に判断するのではなく、「1つの目的に集中しているか」を基準に分割しましょう。
9-4. 引数を増やしすぎない
引数が多いメソッドは、呼び出し方を間違えやすくなります。
void CreateUser(string firstName,string lastName,int age,string city,string address,string phoneNumber,string email){}関連する値が多い場合は、クラスやrecordへまとめる方法があります。
public record CreateUserRequest(string FirstName,string LastName,int Age,string City,string Address,string PhoneNumber,string Email);void CreateUser(CreateUserRequest request){Console.WriteLine(request.FirstName);}引数をオブジェクトへまとめると、項目の意味が明確になり、後から項目を追加しやすくなります。
9-5. コメントを適切に書く
コメントは、コードを読んでもわからない理由や注意点を補足するために使います。
処理内容をそのまま日本語にしただけのコメントは、あまり役に立ちません。
// 価格に1.1を掛けるdouble total = price * 1.1;「なぜその処理が必要なのか」を書くと、意味のあるコメントになります。
// 会員向けの価格表示では、キャンペーン割引を適用しないdouble total = CalculateStandardPrice(price);外部へ公開するメソッドには、XMLドキュメントコメントを付ける方法もあります。
/// <summary>/// 2つの整数を加算します。/// </summary>/// <param name="a">1つ目の整数</param>/// <param name="b">2つ目の整数</param>/// <returns>加算結果</returns>public int Add(int a, int b){return a + b;}10. C#メソッドの練習問題
10-1. voidメソッドを作る練習
「C#の学習を開始します」と表示するStartLearningメソッドを作成してみましょう。
解答例は次のとおりです。
static void StartLearning(){Console.WriteLine("C#の学習を開始します");}呼び出し方は次のとおりです。
StartLearning();10-2. 戻り値ありメソッドを作る練習
2つの整数を掛け算し、結果を返すMultiplyメソッドを作成してみましょう。
解答例は次のとおりです。
static int Multiply(int a, int b){return a * b;}int result = Multiply(6, 7);Console.WriteLine(result); // 4210-3. 引数ありメソッドを作る練習
名前と年齢を受け取り、「山田さんは20歳です」のように表示するメソッドを作成してみましょう。
解答例は次のとおりです。
static void ShowProfile(string name, int age){Console.WriteLine($"{name}さんは{age}歳です");}ShowProfile("山田", 20);10-4. オーバーロードを使う練習
2つの整数を足すメソッドと、3つの整数を足すメソッドを、同じAddという名前で作成してみましょう。
解答例は次のとおりです。
static int Add(int a, int b){return a + b;}static int Add(int a, int b, int c){return a + b + c;}
Console.WriteLine(Add(1, 2));Console.WriteLine(Add(1, 2, 3));引数の数が異なるため、C#が適切なメソッドを選択します。
10-5. クラスを分けてメソッドを呼び出す練習
CalculatorクラスにSubtractメソッドを定義し、Programクラスから呼び出してみましょう。
解答例は次のとおりです。
class Calculator{public int Subtract(int a, int b){return a - b;}}class Program{static void Main(){Calculator calculator = new Calculator(); int result = calculator.Subtract(10, 3);Console.WriteLine(result);}
}
Subtractはインスタンスメソッドなので、Calculatorのインスタンスを作成してから呼び出します。
11. C#メソッドに関するよくある質問
11-1. C#のメソッドと関数は同じですか?
似た意味ですが、厳密には使われ方が異なります。
関数は、入力を受け取って処理を行う仕組み全般を指す言葉です。メソッドは、クラスや構造体などの型に所属する関数を指します。
C#では、多くの処理をクラスなどの内部に定義するため、一般的に「メソッド」という言葉が使われます。初心者の段階では、C#で定義する名前付きの処理をメソッドと覚えて問題ありません。
11-2. voidはどんなときに使いますか?
呼び出し元へ値を返す必要がないときにvoidを使います。
たとえば、次のような処理です。
コンソールにメッセージを表示する
ファイルへデータを書き込む
オブジェクトの状態を更新する
メールを送信する
ログを記録する
static void ShowError(string message){Console.WriteLine($"エラー:{message}");}処理が成功したかどうかを呼び出し側で判断する必要がある場合は、boolなどの戻り値を持たせることも検討します。
11-3. returnは必ず必要ですか?
戻り値があるメソッドでは、基本的にすべての実行経路でreturnが必要です。
static int GetNumber(){return 10;}voidメソッドでは、returnを省略できます。
static void ShowMessage(){Console.WriteLine("こんにちは");}ただし、voidメソッドを途中で終了させるためにreturn;を使うことはできます。
static void ShowNumber(int number){if (number < 0){return;}Console.WriteLine(number);
}
11-4. staticはいつ使いますか?
特定のインスタンスの状態を必要としない処理にstaticを使います。
たとえば、次のような処理です。
単純な数値計算
単位変換
入力値の検証
文字列の整形
クラス全体で共通する処理
static bool IsPositive(int number){return number > 0;}一方、ユーザー名、残高、在庫数など、オブジェクトごとに異なる状態を扱う場合はインスタンスメソッドが適しています。
すべてのメソッドを安易にstaticにするのではなく、「オブジェクトごとの状態を扱うか」を基準に判断しましょう。
11-5. メソッド名の命名ルールはありますか?
C#では、メソッド名にPascalCaseを使用するのが一般的です。
GetUserName()CalculateTotal()SaveOrder()また、次の点を意識するとわかりやすい名前になります。
処理を表す動詞を使う
略語を使いすぎない
曖昧な名前を避ける
戻り値が
boolならIs、Has、Canなどを検討する非同期メソッドには
Asyncを付ける
bool IsEmailValid(string email){return email.Contains('@');}async Task SaveDataAsync(){await Task.Delay(100);}
名前が長くなっても、役割が正確に伝わることを優先しましょう。
まとめ
C#のメソッドとは、特定の処理をひとまとまりにして、名前を付けたものです。メソッドを利用すると、同じ処理を再利用でき、コードを役割ごとに整理できます。
基本構文は次のとおりです。
アクセス修飾子 戻り値の型 メソッド名(引数リスト){処理}値を返さないメソッドにはvoidを指定し、値を返すメソッドでは戻り値の型とreturn文を使用します。
static void ShowMessage(){Console.WriteLine("こんにちは");}static int Add(int a, int b){return a + b;}
また、クラス自体に所属する処理にはstaticメソッドを使用し、オブジェクトごとの状態を扱う処理にはインスタンスメソッドを使用します。
C#のメソッドを理解するためには、構文を覚えるだけでなく、実際に小さなメソッドを作って呼び出す練習が重要です。まずは、メッセージを表示するvoidメソッド、計算結果を返すメソッド、引数を受け取るメソッドの順に作成し、少しずつオーバーロードや非同期メソッドへ進むと理解しやすくなります。

