C#のfunctionとは?関数とメソッドの違いから定義・呼び出し・引数・戻り値まで初心者向けに解説
はじめに
C#を学び始めると、「C# functionとは何か」「C#で関数はどう書くのか」と検索する人は多いです。JavaScriptやPHP、Pythonなどでは「function」や「関数」という言葉がよく使われるため、C#でも同じように考えたくなるかもしれません。
ただし、C#では一般的に「function」ではなく「メソッド」という言葉を使います。C#における処理のまとまりは、多くの場合、クラスや構造体の中に定義されるため「関数」よりも「メソッド」と呼ぶのが自然です。
この記事では、C#のfunctionに相当する「メソッド」について、関数との違い、基本構文、定義方法、呼び出し方法、引数、戻り値、よくあるエラーまで初心者向けにわかりやすく解説します。
1. C#のfunctionとは?まず結論から理解しよう
1-1. C#では「function」よりも「メソッド」と呼ぶのが一般的
C#で「function」と検索している場合、多くのケースでは「メソッド」のことを知りたいという意味になります。
たとえば、次のようなコードがあります。
C#static void SayHello()
{
Console.WriteLine("こんにちは");
}
この SayHello は、C#では「関数」ではなく「メソッド」と呼ぶのが一般的です。
C#にはJavaScriptのような function キーワードは基本的にありません。C#では、戻り値の型、メソッド名、引数リストを使ってメソッドを定義します。
1-2. 初心者が検索する「C# function」の意味
初心者が「C# function」と検索する場合、主に次のようなことを知りたいはずです。
C#で関数のような処理をどう書くのか
C#でメソッドをどう定義するのか
メソッドをどう呼び出すのか
引数や戻り値をどう使うのか
JavaScriptなどのfunctionと何が違うのか
つまり、「C# function」とは、C#における処理の部品である「メソッド」を理解するための入り口だと考えるとよいでしょう。
1-3. 関数・メソッド・functionの関係を簡単に整理
関数、メソッド、functionは似た意味で使われることがありますが、厳密には少し違います。
関数とは、入力を受け取り、処理を行い、必要に応じて結果を返す処理のまとまりです。英語ではfunctionと呼ばれます。
一方、メソッドは、クラスやオブジェクトに属する関数のようなものです。C#ではクラスを中心にプログラムを書くため、処理のまとまりは基本的にメソッドとして定義します。
つまり、C#で「function」と言いたい場面の多くは、「メソッド」と言い換えると正確です。
1-4. この記事で学べること
この記事では、C#のfunctionに相当するメソッドについて、次の内容を学べます。
C#における関数とメソッドの違い
メソッドの基本構文
メソッドの定義方法
メソッドの呼び出し方法
引数の使い方
戻り値の使い方
staticメソッドとインスタンスメソッドの違い
ローカル関数、ラムダ式、Func、Actionの概要
初心者がつまずきやすいエラーと対処法
2. C#における関数とメソッドの違い
2-1. 関数とは何か
関数とは、特定の処理をひとまとまりにしたものです。
たとえば、「2つの数値を足す」「文字列を表示する」「年齢を判定する」といった処理を、名前を付けて再利用できる形にしたものが関数です。
一般的なイメージは次のようになります。
C#入力 → 処理 → 出力
たとえば、2つの数値を受け取って合計を返す処理は、関数的な考え方です。
C#int Add(int a, int b)
{
return a + b;
}
このように、引数を受け取り、処理を行い、戻り値を返すものを広い意味で関数と呼びます。
2-2. メソッドとは何か
メソッドとは、クラスや構造体などの中に定義される処理のまとまりです。
C#では、基本的にメソッドはクラスの中に書きます。
C#class Program
{
static void SayHello()
{
Console.WriteLine("こんにちは");
}
}
この SayHello は、Program クラスの中に定義されたメソッドです。
C#はオブジェクト指向プログラミングを基本とする言語なので、処理はクラスやオブジェクトに関連付けて書くことが多いです。そのため、C#では「関数」よりも「メソッド」という言葉がよく使われます。
2-3. C#ではクラスの中に定義する処理をメソッドと呼ぶ
C#の基本的なプログラムは、クラスの中にメソッドを書いて構成します。
C#class Program
{
static void Main()
{
ShowMessage();
}
static void ShowMessage()
{
Console.WriteLine("メソッドを呼び出しました");
}
}
この例では、Main も ShowMessage もメソッドです。
Main メソッドは、C#プログラムの実行開始地点として使われます。そして、ShowMessage メソッドは、画面にメッセージを表示するための処理です。
2-4. 他の言語のfunctionとC#のメソッドの違い
JavaScriptでは、次のように function キーワードを使って関数を定義できます。
JavaScriptfunction sayHello() {
console.log("こんにちは");
}
一方、C#では次のように書きます。
C#static void SayHello()
{
Console.WriteLine("こんにちは");
}
C#では function というキーワードではなく、戻り値の型として void や int、string などを書きます。
また、C#のメソッドは基本的にクラスの中に定義します。この点が、JavaScriptなどのfunctionと大きく異なるポイントです。
2-5. 初心者が混同しやすいポイント
初心者が混同しやすいのは、「関数」と「メソッド」は完全に別物なのかという点です。
結論として、広い意味ではメソッドも関数の一種と考えることができます。ただし、C#ではクラスの中に定義された処理を「メソッド」と呼ぶのが一般的です。
そのため、C#を学ぶときは次のように理解するとわかりやすいです。
C#C#のfunction = メソッド
厳密な言葉の違いよりも、まずは「C#では処理のまとまりをメソッドとして定義し、必要な場所から呼び出して使う」と理解しましょう。
3. C#のメソッドの基本構文
3-1. メソッド定義の基本形
C#のメソッドは、基本的に次の形で定義します。
C#アクセス修飾子 戻り値の型 メソッド名(引数リスト)
{
処理;
}
たとえば、次のようなメソッドがあります。
C#public static void SayHello()
{
Console.WriteLine("こんにちは");
}
このメソッドは、呼び出されると「こんにちは」と表示します。
それぞれの要素には意味があります。
C#public // アクセス修飾子
static // staticメソッドであることを表す
void // 戻り値がないことを表す
SayHello // メソッド名
() // 引数リスト
3-2. アクセス修飾子とは
アクセス修飾子とは、そのメソッドをどこから呼び出せるかを決めるものです。
代表的なアクセス修飾子には次のようなものがあります。
C#public
private
protected
internal
初心者がまず覚えるべきなのは、public と private です。
public は、クラスの外からも呼び出せることを意味します。
C#public void Show()
{
Console.WriteLine("表示します");
}
private は、同じクラスの中からだけ呼び出せることを意味します。
C#private void ShowSecret()
{
Console.WriteLine("内部処理です");
}
アクセス修飾子を省略した場合の扱いは場所によって異なるため、初心者のうちは意識して public や private を書くと理解しやすくなります。
3-3. 戻り値の型とは
戻り値の型とは、メソッドが処理結果として返す値の型です。
たとえば、整数を返すメソッドなら int を書きます。
C#int GetNumber()
{
return 10;
}
文字列を返すメソッドなら string を書きます。
C#string GetName()
{
return "田中";
}
戻り値がないメソッドでは void を使います。
C#void ShowMessage()
{
Console.WriteLine("メッセージです");
}
void は「何も返さない」という意味です。
3-4. メソッド名の付け方
メソッド名は、そのメソッドが何をするのかがわかる名前にします。
C#では、メソッド名は一般的にパスカルケースで書きます。パスカルケースとは、単語の先頭を大文字にする書き方です。
C#ShowMessage
GetUserName
CalculateTotal
CheckAge
悪い例として、意味がわかりにくい名前があります。
C#Do()
Test()
A()
このような名前では、後からコードを読んだときに何をするメソッドなのかわかりにくくなります。
メソッド名は「動詞 + 名詞」の形にするとわかりやすいです。
C#ShowMessage()
GetPrice()
CalculateTax()
ValidateInput()
3-5. 引数リストとは
引数リストとは、メソッドに渡す値を定義する部分です。
C#void SayHello(string name)
{
Console.WriteLine($"{name}さん、こんにちは");
}
この例では、string name が引数です。
引数がない場合は、丸かっこの中を空にします。
C#void SayHello()
{
Console.WriteLine("こんにちは");
}
複数の引数を使う場合は、カンマで区切ります。
C#int Add(int a, int b)
{
return a + b;
}
3-6. メソッド本体に処理を書く方法
メソッド本体とは、波かっこ { } の中に書く処理のことです。
C#void ShowMessage()
{
Console.WriteLine("処理を開始します");
Console.WriteLine("処理中です");
Console.WriteLine("処理を終了します");
}
メソッド本体には、変数の宣言、条件分岐、繰り返し、別のメソッドの呼び出しなどを書くことができます。
C#void CheckScore(int score)
{
if (score >= 80)
{
Console.WriteLine("合格です");
}
else
{
Console.WriteLine("不合格です");
}
}
このように、メソッドの中に処理をまとめることで、コードを整理しやすくなります。
4. C#でメソッドを定義する方法
4-1. 戻り値がないメソッドの定義
戻り値がないメソッドを定義する場合は、戻り値の型に void を指定します。
C#static void ShowMessage()
{
Console.WriteLine("こんにちは");
}
このメソッドは、画面に文字を表示するだけで、呼び出し元に値を返しません。
呼び出すときは次のように書きます。
C#ShowMessage();
void メソッドは、「表示する」「保存する」「更新する」など、何らかの処理を実行する目的でよく使われます。
4-2. 戻り値があるメソッドの定義
戻り値があるメソッドでは、戻り値の型を指定し、return 文で値を返します。
C#static int Add(int a, int b)
{
return a + b;
}
このメソッドは、2つの整数を受け取り、その合計を返します。
呼び出し側では、戻り値を変数に代入できます。
C#int result = Add(3, 5);
Console.WriteLine(result);
実行結果は次のようになります。
C#8
戻り値があるメソッドでは、指定した型と同じ型の値を返す必要があります。
4-3. 引数がないメソッドの定義
引数がないメソッドは、丸かっこの中を空にして定義します。
C#static void ShowToday()
{
Console.WriteLine("今日はC#を学習します");
}
呼び出すときも、丸かっこを付けます。
C#ShowToday();
引数がないメソッドは、外から値を受け取らず、決まった処理を実行したいときに使います。
4-4. 引数があるメソッドの定義
引数があるメソッドは、外から値を受け取って処理できます。
C#static void SayHello(string name)
{
Console.WriteLine($"{name}さん、こんにちは");
}
呼び出すときは、引数に値を渡します。
C#SayHello("佐藤");
実行結果は次のようになります。
C#佐藤さん、こんにちは
引数を使うことで、同じメソッドでも渡す値によって処理結果を変えられます。
4-5. 複数の引数を受け取るメソッドの定義
複数の引数を受け取る場合は、カンマで区切って定義します。
C#static void ShowProfile(string name, int age)
{
Console.WriteLine($"名前: {name}");
Console.WriteLine($"年齢: {age}");
}
呼び出すときも、定義した順番に値を渡します。
C#ShowProfile("田中", 25);
実行結果は次のようになります。
C#名前: 田中
年齢: 25
引数の順番や型が合っていないとエラーになるため注意が必要です。
4-6. staticメソッドとインスタンスメソッドの違い
C#のメソッドには、大きく分けて static メソッドとインスタンスメソッドがあります。
static メソッドは、クラスから直接呼び出せるメソッドです。
C#class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
呼び出すときは、次のようにクラス名を使います。
C#int result = Calculator.Add(3, 5);
一方、インスタンスメソッドは、オブジェクトを作成してから呼び出します。
C#class Person
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}
呼び出すときは、次のようにします。
C#Person person = new Person();
person.SayHello();
初心者のうちは、Main メソッドから呼び出す練習では static メソッドを使うことが多いです。ただし、C#のオブジェクト指向を理解するには、インスタンスメソッドも重要です。
5. C#でメソッドを呼び出す方法
5-1. メソッド呼び出しの基本
メソッドを呼び出すには、メソッド名の後ろに丸かっこを付けます。
C#ShowMessage();
引数がある場合は、丸かっこの中に値を渡します。
C#SayHello("山田");
戻り値がある場合は、結果を変数に代入できます。
C#int total = Add(10, 20);
メソッドは定義しただけでは実行されません。呼び出して初めて処理が実行されます。
5-2. Mainメソッドから呼び出す方法
C#のコンソールアプリでは、Main メソッドが実行の入口になります。
C#class Program
{
static void Main()
{
ShowMessage();
}
static void ShowMessage()
{
Console.WriteLine("Mainメソッドから呼び出しました");
}
}
このプログラムでは、まず Main メソッドが実行され、その中で ShowMessage メソッドが呼び出されます。
実行結果は次のようになります。
C#Mainメソッドから呼び出しました
同じクラス内の static メソッドであれば、メソッド名だけで呼び出せます。
5-3. 引数を渡して呼び出す方法
引数を持つメソッドを呼び出すには、定義された型に合う値を渡します。
C#static void ShowAge(int age)
{
Console.WriteLine($"年齢は{age}歳です");
}
呼び出し例は次の通りです。
C#ShowAge(20);
実行結果は次のようになります。
C#年齢は20歳です
文字列を渡す場合は、ダブルクォーテーションで囲みます。
C#static void ShowName(string name)
{
Console.WriteLine($"名前は{name}です");
}
ShowName("鈴木");
5-4. 戻り値を受け取って使う方法
戻り値があるメソッドは、呼び出し結果を変数に代入して使えます。
C#static int Square(int number)
{
return number * number;
}
呼び出し例は次の通りです。
C#int result = Square(4);
Console.WriteLine(result);
実行結果は次のようになります。
C#16
戻り値は、変数に代入するだけでなく、そのまま別の処理に使うこともできます。
C#Console.WriteLine(Square(5));
5-5. クラスの外からメソッドを呼び出す方法
別のクラスにあるメソッドを呼び出す場合、static メソッドであればクラス名を使って呼び出せます。
C#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);
}
}
インスタンスメソッドの場合は、オブジェクトを作成してから呼び出します。
C#class Greeter
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}
class Program
{
static void Main()
{
Greeter greeter = new Greeter();
greeter.SayHello();
}
}
クラスの外から呼び出すには、メソッドが public になっている必要があります。
5-6. 呼び出し時によくあるエラー
メソッド呼び出しでよくあるエラーには、次のようなものがあります。
メソッド名のスペルミスです。
C#ShowMassage(); // ShowMessageのつもり
引数の数が違うケースです。
C#Add(10); // 本来は2つの引数が必要
引数の型が違うケースです。
C#ShowAge("20"); // intが必要なのにstringを渡している
static ではないメソッドを、オブジェクトなしで呼び出そうとするケースもよくあります。
C#Person.SayHello(); // インスタンスメソッドならエラー
エラーが出たときは、メソッド名、引数の数、引数の型、staticの有無、アクセス修飾子を確認しましょう。
6. C#の引数の使い方
6-1. 引数とは何か
引数とは、メソッドに渡す値のことです。
たとえば、次のメソッドでは name が引数です。
C#static void SayHello(string name)
{
Console.WriteLine($"{name}さん、こんにちは");
}
呼び出すときに "田中" を渡すと、メソッドの中で name として使えます。
C#SayHello("田中");
引数を使うことで、メソッドの処理を柔軟にできます。
6-2. 仮引数と実引数の違い
メソッドを定義するときに書く引数を「仮引数」と呼びます。
C#static void SayHello(string name)
この name が仮引数です。
一方、メソッドを呼び出すときに渡す値を「実引数」と呼びます。
C#SayHello("田中");
この "田中" が実引数です。
初心者のうちは、仮引数は「受け取る側の変数」、実引数は「渡す側の値」と考えるとわかりやすいです。
6-3. 値渡しの基本
C#の通常の引数は、基本的に値渡しです。
C#static void ChangeNumber(int number)
{
number = 100;
}
static void Main()
{
int x = 10;
ChangeNumber(x);
Console.WriteLine(x);
}
実行結果は次のようになります。
C#10
ChangeNumber の中で number を変更しても、呼び出し元の x は変わりません。
これは、値そのものではなく、値のコピーがメソッドに渡されるためです。
6-4. ref引数の使い方
ref を使うと、呼び出し元の変数そのものをメソッド内で変更できます。
C#static void ChangeNumber(ref int number)
{
number = 100;
}
static void Main()
{
int x = 10;
ChangeNumber(ref x);
Console.WriteLine(x);
}
実行結果は次のようになります。
C#100
ref を使う場合は、メソッド定義側と呼び出し側の両方に ref を書く必要があります。
C#ChangeNumber(ref x);
ref 引数に渡す変数は、事前に初期化されている必要があります。
6-5. out引数の使い方
out は、メソッドから複数の値を返したいときによく使われます。
C#static void GetUser(out string name, out int age)
{
name = "佐藤";
age = 30;
}
static void Main()
{
GetUser(out string userName, out int userAge);
Console.WriteLine(userName);
Console.WriteLine(userAge);
}
実行結果は次のようになります。
C#佐藤
30
out 引数は、メソッド内で必ず値を代入する必要があります。
また、int.TryParse でも out がよく使われます。
C#string text = "123";
if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
このように、変換に成功したかどうかを bool で返し、変換後の値を out 引数で受け取る書き方はC#でよく使われます。
6-6. optional引数の使い方
optional引数は、省略可能な引数です。引数に初期値を設定することで使えます。
C#static void SayHello(string name = "ゲスト")
{
Console.WriteLine($"{name}さん、こんにちは");
}
引数を渡して呼び出すこともできます。
C#SayHello("田中");
引数を省略して呼び出すこともできます。
C#SayHello();
実行結果は次のようになります。
C#ゲストさん、こんにちは
optional引数は便利ですが、多用すると呼び出し側の意図がわかりにくくなることもあります。必要な場面で使いましょう。
6-7. paramsを使った可変長引数
params を使うと、引数の数を自由に変えられるメソッドを定義できます。
C#static int Sum(params int[] numbers)
{
int total = 0;
foreach (int number in numbers)
{
total += number;
}
return total;
}
呼び出し例は次の通りです。
C#Console.WriteLine(Sum(1, 2, 3));
Console.WriteLine(Sum(10, 20, 30, 40));
実行結果は次のようになります。
C#6
100
params は、複数の値をまとめて渡したいときに便利です。ただし、params 引数は通常、引数リストの最後に1つだけ指定します。
7. C#の戻り値の使い方
7-1. 戻り値とは何か
戻り値とは、メソッドが処理結果として呼び出し元に返す値のことです。
たとえば、次のメソッドは整数を返します。
C#static int GetNumber()
{
return 10;
}
呼び出し側では、戻り値を受け取れます。
C#int number = GetNumber();
Console.WriteLine(number);
戻り値を使うことで、メソッドの処理結果を別の処理に活用できます。
7-2. return文の基本
return 文は、メソッドから値を返すために使います。
C#static int Add(int a, int b)
{
return a + b;
}
このメソッドでは、a + b の結果を呼び出し元に返しています。
戻り値の型が int の場合、return で返す値も int である必要があります。
C#static string GetMessage()
{
return "こんにちは";
}
このメソッドでは、戻り値の型が string なので、文字列を返しています。
7-3. voidと戻り値ありメソッドの違い
void メソッドは値を返しません。
C#static void ShowMessage()
{
Console.WriteLine("こんにちは");
}
戻り値ありメソッドは、指定した型の値を返します。
C#static int GetScore()
{
return 80;
}
void は「処理を実行する」ことが目的のメソッドでよく使われます。
一方、戻り値ありメソッドは「計算結果を返す」「判定結果を返す」「文字列を作って返す」ような場面で使われます。
7-4. 戻り値を変数に代入する方法
戻り値は、変数に代入して使えます。
C#static int Multiply(int a, int b)
{
return a * b;
}
static void Main()
{
int result = Multiply(4, 5);
Console.WriteLine(result);
}
実行結果は次のようになります。
C#20
戻り値を変数に入れることで、後続の処理で何度も使えます。
C#int price = 1000;
int tax = CalculateTax(price);
int total = price + tax;
このように、戻り値を使うと処理を段階的に組み立てられます。
7-5. bool・int・stringなど型別の戻り値例
bool を返すメソッドは、条件判定によく使われます。
C#static bool IsAdult(int age)
{
return age >= 18;
}
呼び出し例です。
C#if (IsAdult(20))
{
Console.WriteLine("成人です");
}
int を返すメソッドは、計算結果を返すときによく使われます。
C#static int Add(int a, int b)
{
return a + b;
}
string を返すメソッドは、文字列を作成して返すときに使えます。
C#static string CreateGreeting(string name)
{
return $"{name}さん、こんにちは";
}
呼び出し例です。
C#string message = CreateGreeting("山田");
Console.WriteLine(message);
戻り値の型を意識すると、メソッドが何を返すのかを理解しやすくなります。
7-6. return文で処理を終了する使い方
return 文は、値を返すだけでなく、メソッドの処理を終了する役割もあります。
C#static void CheckNumber(int number)
{
if (number < 0)
{
Console.WriteLine("負の数です");
return;
}
Console.WriteLine("0以上の数です");
}
この例では、number が負の数の場合、メッセージを表示したあと return によってメソッドを終了します。
void メソッドでも、値を返さない return; を使えます。
早めに処理を終了することで、複雑な条件分岐を減らし、コードを読みやすくできます。
8. C#のメソッドを使うメリット
8-1. 同じ処理を何度も書かずに済む
メソッドを使う大きなメリットは、同じ処理を何度も書かなくて済むことです。
たとえば、何度も同じメッセージを表示する場合、毎回 Console.WriteLine を書くのではなく、メソッドにまとめられます。
C#static void ShowError()
{
Console.WriteLine("エラーが発生しました");
}
必要な場所で呼び出せば、同じ処理を再利用できます。
C#ShowError();
ShowError();
ShowError();
コードの重複を減らすことは、プログラムをわかりやすく保つうえで非常に重要です。
8-2. コードの見通しが良くなる
メソッドを使うと、処理に名前を付けられます。
C#ValidateInput();
CalculateTotal();
ShowResult();
このように書かれていると、細かい処理の中身を見なくても、全体の流れを理解しやすくなります。
長い処理を1つのメソッドにすべて書くと、どこで何をしているのかわかりにくくなります。
処理ごとにメソッドへ分けることで、コードの見通しが良くなります。
8-3. 修正や保守がしやすくなる
同じ処理を複数の場所に書いていると、変更が必要になったときにすべての場所を修正しなければなりません。
しかし、メソッドにまとめていれば、修正箇所は基本的に1か所で済みます。
C#static int CalculateTax(int price)
{
return price / 10;
}
税率の計算方法を変更したい場合、このメソッドの中だけを修正すればよくなります。
メソッドを適切に使うことで、保守しやすいコードになります。
8-4. 処理を部品化して再利用できる
メソッドは、処理を部品化するための仕組みです。
たとえば、次のように計算処理をメソッドに分けることができます。
C#static int CalculateTotal(int price, int tax)
{
return price + tax;
}
このメソッドは、別の場所でも再利用できます。
処理を小さな部品に分けておくと、新しい機能を作るときにも組み合わせやすくなります。
8-5. 初心者がメソッドを学ぶべき理由
初心者がC#を学ぶうえで、メソッドは非常に重要です。
メソッドを理解すると、次のような力が身につきます。
処理を整理する力
コードを再利用する力
エラーの原因を切り分ける力
オブジェクト指向を理解する土台
読みやすいコードを書く力
最初は static void ShowMessage() のような簡単なメソッドから始めれば十分です。慣れてきたら、引数や戻り値を使って、より柔軟なメソッドを書けるようにしましょう。
9. C#のfunctionに関連する応用知識
9-1. ローカル関数とは
ローカル関数とは、メソッドの中に定義できる関数のようなものです。
C#static void Main()
{
int Add(int a, int b)
{
return a + b;
}
int result = Add(3, 5);
Console.WriteLine(result);
}
この例では、Add が Main メソッドの中に定義されています。
ローカル関数は、そのメソッドの中だけで使う補助的な処理をまとめたいときに便利です。
ただし、初心者のうちはまず通常のメソッドを理解してから学ぶとよいでしょう。
9-2. ラムダ式とは
ラムダ式とは、短い処理を簡潔に書くための記法です。
C#Func<int, int, int> add = (a, b) => a + b;
この例では、2つの整数を受け取り、その合計を返す処理をラムダ式で書いています。
呼び出すときは次のようにします。
C#int result = add(3, 5);
Console.WriteLine(result);
ラムダ式は、LINQやイベント処理、コールバック処理などでよく使われます。
C#var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
この n => n % 2 == 0 がラムダ式です。
9-3. Funcデリゲートとは
Func は、戻り値がある処理を変数のように扱うためのデリゲートです。
C#Func<int, int, int> add = (a, b) => a + b;
この場合、最初の int と2つ目の int は引数の型で、最後の int は戻り値の型です。
つまり、次のような意味になります。
C#int型の引数を2つ受け取り、int型の値を返す処理
呼び出し例です。
C#int result = add(10, 20);
Console.WriteLine(result);
Func は、メソッドそのものを値として渡したい場面で使われます。
9-4. Actionデリゲートとは
Action は、戻り値がない処理を表すデリゲートです。
C#Action<string> showMessage = message =>
{
Console.WriteLine(message);
};
呼び出し例です。
C#showMessage("こんにちは");
Action は void メソッドのように、値を返さない処理を扱うときに使います。
引数がない Action も書けます。
C#Action greet = () =>
{
Console.WriteLine("こんにちは");
};
greet();
Func は戻り値がある処理、Action は戻り値がない処理と覚えるとわかりやすいです。
9-5. メソッドとラムダ式・Funcの使い分け
通常の処理は、まずメソッドとして書くのが基本です。
C#static int Add(int a, int b)
{
return a + b;
}
一方、短い処理を一時的に使いたい場合は、ラムダ式や Func が便利です。
C#Func<int, int, int> add = (a, b) => a + b;
使い分けの目安は次の通りです。
名前を付けて再利用したい処理はメソッド
短く一時的に使う処理はラムダ式
処理を変数や引数として扱いたい場合はFuncやAction
LINQで条件や変換を書く場合はラムダ式
初心者のうちは、まずメソッドをしっかり理解することが重要です。
9-6. 初心者はどこまで理解すべきか
初心者が最初に理解すべきなのは、通常のメソッドです。
まずは次の内容を優先しましょう。
voidメソッド戻り値があるメソッド
引数があるメソッド
return文staticメソッドインスタンスメソッド
ローカル関数、ラムダ式、Func、Action は応用的な内容です。C#の基本文法に慣れてから学べば問題ありません。
「C# function」と検索している段階では、まず「C#ではfunctionではなくメソッドと呼ぶ」「メソッドは処理をまとめて再利用するための仕組み」と理解することが大切です。
10. C#のメソッドでよくあるエラーと対処法
10-1. メソッド名のスペルミス
メソッド名のスペルミスは、初心者によくあるエラーです。
C#static void ShowMessage()
{
Console.WriteLine("こんにちは");
}
static void Main()
{
ShowMassage();
}
この例では、定義したメソッド名は ShowMessage ですが、呼び出し時に ShowMassage と書いています。
正しくは次の通りです。
C#ShowMessage();
C#では大文字と小文字も区別されます。
C#showMessage();
ShowMessage();
この2つは別の名前として扱われます。メソッド名は正確に書きましょう。
10-2. 引数の数が合わない
メソッド定義と呼び出しで、引数の数が合わないとエラーになります。
C#static int Add(int a, int b)
{
return a + b;
}
static void Main()
{
int result = Add(10);
}
Add メソッドは2つの引数を必要としていますが、呼び出し時に1つしか渡していません。
正しくは次のように書きます。
C#int result = Add(10, 20);
エラーが出たら、メソッド定義の引数リストを確認しましょう。
10-3. 引数の型が合わない
引数の型が合わない場合もエラーになります。
C#static void ShowAge(int age)
{
Console.WriteLine(age);
}
static void Main()
{
ShowAge("20");
}
ShowAge は int 型の引数を受け取るメソッドですが、呼び出し側では文字列 "20" を渡しています。
正しくは次のようにします。
C#ShowAge(20);
文字列を数値に変換したい場合は、int.Parse や int.TryParse を使います。
C#string text = "20";
if (int.TryParse(text, out int age))
{
ShowAge(age);
}
10-4. 戻り値を返していない
戻り値があるメソッドでは、必ず値を返す必要があります。
C#static int GetNumber()
{
Console.WriteLine("数値を返します");
}
このメソッドは int を返す定義になっていますが、return 文がありません。
正しくは次のようにします。
C#static int GetNumber()
{
return 10;
}
条件分岐がある場合も、すべての経路で値を返す必要があります。
C#static int GetScore(bool isPassed)
{
if (isPassed)
{
return 100;
}
return 0;
}
10-5. staticに関するエラー
static に関するエラーも初心者がよくつまずくポイントです。
たとえば、static な Main メソッドから、インスタンスメソッドを直接呼び出すとエラーになります。
C#class Program
{
static void Main()
{
SayHello();
}
void SayHello()
{
Console.WriteLine("こんにちは");
}
}
この場合、SayHello はインスタンスメソッドなので、直接呼び出せません。
対処法は2つあります。
1つ目は、SayHello を static にする方法です。
C#static void SayHello()
{
Console.WriteLine("こんにちは");
}
2つ目は、オブジェクトを作成して呼び出す方法です。
C#Program program = new Program();
program.SayHello();
どちらを選ぶべきかは設計によりますが、初心者の練習では static を付けると理解しやすいです。
10-6. アクセス修飾子による呼び出しエラー
メソッドが private の場合、クラスの外から呼び出せません。
C#class Sample
{
private void Show()
{
Console.WriteLine("表示します");
}
}
class Program
{
static void Main()
{
Sample sample = new Sample();
sample.Show();
}
}
この例では、Show メソッドが private なので、Program クラスから呼び出すことはできません。
外部から呼び出したい場合は、public にします。
C#class Sample
{
public void Show()
{
Console.WriteLine("表示します");
}
}
アクセス修飾子は、メソッドをどこから使えるようにするかを決める重要な仕組みです。
11. C#のfunctionに関するよくある質問
11-1. C#にfunctionキーワードはある?
C#には、JavaScriptのような function キーワードはありません。
JavaScriptでは次のように書きます。
JavaScriptfunction sayHello() {
console.log("こんにちは");
}
C#では次のようにメソッドとして書きます。
C#static void SayHello()
{
Console.WriteLine("こんにちは");
}
C#でfunctionのような処理を書きたい場合は、メソッドを定義すると考えましょう。
11-2. C#の関数とメソッドは同じ意味?
厳密には違いますが、初心者向けには「C#の関数 = メソッド」と考えても大きな問題はありません。
ただし、C#ではクラスや構造体の中に定義する処理を「メソッド」と呼ぶのが一般的です。
そのため、学習中は「関数」と言われたら広い意味の処理のまとまり、「メソッド」と言われたらC#で実際に書く処理のまとまり、と理解するとよいでしょう。
11-3. JavaScriptのfunctionとC#のメソッドは何が違う?
JavaScriptの function は、関数を定義するためのキーワードです。
JavaScriptfunction add(a, b) {
return a + b;
}
C#では function キーワードを使わず、戻り値の型を先に書きます。
C#static int Add(int a, int b)
{
return a + b;
}
また、C#は型を明確に書く言語なので、引数や戻り値の型を指定します。
C#int a
int b
int Add(...)
JavaScriptは比較的柔軟に書けますが、C#は型を意識して安全に書くことが特徴です。
11-4. メソッドはクラスの外に書ける?
C#では、通常のメソッドをクラスの外に直接書くことはできません。
基本的には、次のようにクラスの中に書きます。
C#class Program
{
static void SayHello()
{
Console.WriteLine("こんにちは");
}
}
ただし、C# 9以降ではトップレベルステートメントにより、簡単なプログラムではクラスや Main メソッドを明示せずに書ける場合があります。
C#Console.WriteLine("こんにちは");
しかし、メソッドそのものを学ぶ場合は、クラスの中に定義する基本形を理解しておくことが重要です。
11-5. 初心者はstaticメソッドから学べばよい?
初心者は、まず static メソッドから学ぶと理解しやすいです。
特にコンソールアプリで Main メソッドから呼び出す練習をする場合、static メソッドを使うとシンプルに書けます。
C#class Program
{
static void Main()
{
SayHello();
}
static void SayHello()
{
Console.WriteLine("こんにちは");
}
}
ただし、C#ではオブジェクト指向も重要です。基本に慣れたら、インスタンスメソッドも学びましょう。
C#class Person
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}
static メソッドだけでなく、オブジェクトを作って呼び出すメソッドも理解すると、C#の学習が進みやすくなります。
11-6. Funcとfunctionは同じもの?
Func と function は同じものではありません。
function は英語で「関数」を意味する一般的な言葉です。JavaScriptなどでは関数定義のキーワードとして使われます。
一方、C#の Func は、戻り値がある処理を表すデリゲートです。
C#Func<int, int, int> add = (a, b) => a + b;
この例では、2つの int を受け取り、int を返す処理を add という変数に代入しています。
通常のメソッドとは書き方も使い方も異なります。
初心者はまず通常のメソッドを理解し、その後に Func やラムダ式を学ぶとよいでしょう。
まとめ
C#で「function」と検索している場合、多くは「メソッド」について知りたいという意味になります。C#にはJavaScriptのような function キーワードはなく、処理のまとまりは基本的にメソッドとして定義します。
C#のメソッドは、次のような形で書きます。
C#戻り値の型 メソッド名(引数リスト)
{
処理;
}
戻り値がない場合は void を使い、戻り値がある場合は int や string、bool などの型を指定します。
C#static void ShowMessage()
{
Console.WriteLine("こんにちは");
}
static int Add(int a, int b)
{
return a + b;
}
メソッドを使うと、同じ処理を何度も書かずに済み、コードの見通しが良くなり、修正や保守もしやすくなります。
初心者はまず、次のポイントを押さえましょう。
C#のfunctionは基本的にメソッドと考える
メソッドはクラスの中に定義する
voidは戻り値がないことを表す戻り値があるメソッドでは
returnを使う引数を使うと外から値を渡せる
staticメソッドはクラスから直接呼び出せるインスタンスメソッドはオブジェクトを作って呼び出す
C#のメソッドは、プログラミングの基本であり、オブジェクト指向や実践的なアプリ開発にもつながる重要な知識です。まずは簡単なメソッドを何度も書き、定義、呼び出し、引数、戻り値の流れに慣れていきましょう。

