C# Functionとは?関数の作り方・引数・戻り値を初心者向けにわかりやすく解説

はじめに

C#を学び始めると、「C# Functionとは何か」「C#で関数はどう書くのか」と疑問に思うことがあります。JavaScriptやPHPなどを触ったことがある人は、functionというキーワードで関数を作るイメージを持っているかもしれません。

しかし、C#では基本的にfunctionというキーワードは使いません。C#で処理をひとまとまりにしたものは、主に「メソッド」と呼ばれます。

この記事では、C# Functionを「C#における関数的な処理のまとまり」として、初心者向けにわかりやすく解説します。関数の作り方、引数、戻り値、staticvoidreturn、よくあるエラーまで、サンプルコードを使いながら順番に見ていきましょう。

1. C# Functionとは?まず知っておきたい基本

C# Functionという言葉は、英語圏や検索キーワードではよく使われますが、C#の文法として正確にいうと「Function」ではなく「Method」、つまり「メソッド」を指すことが多いです。

初心者のうちは、C# Functionを「何らかの処理をまとめて、名前を付けて呼び出せるもの」と理解するとよいでしょう。

たとえば、次のような処理があるとします。

C#
Console.WriteLine("こんにちは");
Console.WriteLine("C#を勉強しています");

この処理を何度も書くのは大変です。そこで、処理をメソッドとしてまとめます。

C#
static void ShowMessage()
{
Console.WriteLine("こんにちは");
Console.WriteLine("C#を勉強しています");
}

これで、必要な場所から次のように呼び出せます。

C#
ShowMessage();

このように、C# Functionはコードを整理し、再利用しやすくするために使います。

1-1. C#におけるFunctionは「関数」ではなく主に「メソッド」を指す

一般的なプログラミング用語では、処理をまとめたものを「関数」と呼ぶことがあります。しかし、C#ではクラスの中に定義する処理のまとまりを「メソッド」と呼びます。

たとえば、次のAddはメソッドです。

C#
class Program
{
static int Add(int a, int b)
{
return a + b;
}
}

Addは2つの数値を受け取り、足し算した結果を返します。見た目は他の言語の関数に似ていますが、C#ではクラスの中に定義されているため、正確には「メソッド」です。

ただし、初心者向けの説明や検索では「C# Function」「C# 関数」という言い方もよく使われます。そのため、この記事では「関数」と「メソッド」をほぼ同じ意味で扱いながら、C#ではメソッドと呼ぶのが正確だと覚えておきましょう。

1-2. C#にfunctionキーワードは存在する?JavaScriptとの違い

JavaScriptでは、次のようにfunctionキーワードを使って関数を作ります。

JavaScript
function hello() {
console.log("こんにちは");
}

一方、C#では次のように書きます。

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

C#には、JavaScriptのようなfunctionキーワードはありません。C#では、戻り値の型、メソッド名、引数リストを使ってメソッドを定義します。

C#の基本形は次のようになります。

C#
戻り値の型 メソッド名(引数)
{
処理;
}

たとえば、戻り値がなく、引数もないメソッドは次のように書きます。

C#
void SayHello()
{
Console.WriteLine("Hello");
}

コンソールアプリのMainメソッドから呼び出す場合は、初心者向けにはstaticを付けることが多いです。

C#
static void SayHello()
{
Console.WriteLine("Hello");
}

C# Functionを調べている人は、まず「C#ではfunctionキーワードではなく、メソッドとして書く」と覚えておくと混乱しにくくなります。

1-3. 関数・メソッド・処理のまとまりを使う目的

C#でメソッドを使う目的は、主に次のようなものです。

同じ処理を何度も使えるようにするため、コードを読みやすくするため、修正しやすくするため、処理の役割を分けるためです。

たとえば、消費税込み価格を計算する処理を何度も書く場合を考えます。

C#
int price1 = 1000;
int taxIncluded1 = (int)(price1 * 1.1);

int price2 = 2000;
int taxIncluded2 = (int)(price2 * 1.1);

同じ計算式が何度も出てくると、税率が変わったときにすべて修正しなければなりません。

そこで、メソッドにまとめます。

C#
static int AddTax(int price)
{
return (int)(price * 1.1);
}

使う側は次のようにシンプルになります。

C#
int taxIncluded1 = AddTax(1000);
int taxIncluded2 = AddTax(2000);

このように、メソッドを使うとコードの重複を減らせます。プログラムが大きくなるほど、関数やメソッドで処理を分けることが重要になります。

1-4. 初心者がC# Functionでつまずきやすいポイント

初心者がC# Functionでつまずきやすいポイントはいくつかあります。

まず、functionと書いてしまうことです。C#ではfunctionキーワードは使いません。

C#
// C#ではこれはエラー
function SayHello()
{
Console.WriteLine("Hello");
}

正しくは次のように書きます。

C#
static void SayHello()
{
Console.WriteLine("Hello");
}

次につまずきやすいのが、戻り値の型です。

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

この場合、intを返すと宣言しているので、必ずint型の値をreturnする必要があります。

また、staticの有無でもエラーになりやすいです。Mainメソッドがstaticの場合、同じクラス内のメソッドをそのまま呼び出すには、そのメソッドもstaticにする必要があります。

C#
class Program
{
static void Main()
{
SayHello();
}

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

初心者のうちは、コンソールアプリで自作メソッドを書くときは、まずstaticを付けて練習すると理解しやすいです。

2. C#で関数を作る基本構文

C#で関数のような処理を作るには、メソッドを定義します。基本構文を理解すれば、文字を表示する処理、計算する処理、値を判定する処理などを自由に作れるようになります。

2-1. メソッド定義の基本形

C#のメソッド定義の基本形は次のとおりです。

C#
戻り値の型 メソッド名(引数リスト)
{
実行したい処理;
}

コンソールアプリでよく見る形にすると、次のようになります。

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

このコードの意味は次のとおりです。

staticは、インスタンスを作らなくても呼び出せるメソッドであることを表します。

voidは、戻り値がないことを表します。

SayHelloは、メソッド名です。

()は、引数を受け取る場所です。この例では引数がないため空です。

{ }の中に、実行したい処理を書きます。

2-2. 戻り値の型・メソッド名・引数リストの意味

メソッド定義では、戻り値の型、メソッド名、引数リストが重要です。

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

この例では、intが戻り値の型です。つまり、このメソッドは整数を返します。

Addがメソッド名です。呼び出すときは、この名前を使います。

int a, int bが引数リストです。このメソッドは、整数を2つ受け取ります。

使うときは次のように書きます。

C#
int result = Add(3, 5);
Console.WriteLine(result);

実行すると、8が表示されます。

C# Functionを理解するうえで、「何を受け取り、何を返すのか」を意識することが大切です。

2-3. voidを使った戻り値なしの関数

戻り値が不要な場合は、voidを使います。

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

このメソッドは、画面に文字を表示するだけで、呼び出し元に値を返しません。

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

C#
ShowWelcomeMessage();

voidのメソッドは、「何かを実行する」ために使うことが多いです。

たとえば、メッセージを表示する、ファイルに書き込む、データを保存する、ログを出力するなどの処理です。

2-4. returnを使った戻り値ありの関数

戻り値があるメソッドでは、returnを使って結果を返します。

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

このメソッドは、受け取った数値を2乗して返します。

C#
int result = Square(4);
Console.WriteLine(result);

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

C#
16

戻り値があるメソッドでは、宣言した型とreturnする値の型を合わせる必要があります。

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

この場合、戻り値の型がstringなので、文字列を返します。

C#
static bool IsAdult(int age)
{
return age >= 18;
}

この場合、戻り値の型がboolなので、trueまたはfalseを返します。

2-5. メソッド名の付け方と命名ルール

C#のメソッド名は、処理の内容がわかる名前にすることが大切です。

たとえば、数値を足すメソッドならAdd、名前を表示するメソッドならShowName、年齢をチェックするメソッドならCheckAgeIsAdultのようにします。

C#では、メソッド名は通常パスカルケースで書きます。パスカルケースとは、単語の先頭を大文字にする書き方です。

C#
ShowMessage
CalculateTotal
GetUserName
IsEven

避けたほうがよい名前は、意味がわかりにくい名前です。

C#
static void A()
{
}

static int DoSomething(int x)
{
return x * 2;
}

ADoSomethingだけでは、何をするメソッドなのかわかりにくいです。

読みやすいコードを書くためには、メソッド名だけで処理内容がある程度伝わるようにしましょう。

3. C# Functionの作り方をサンプルコードで解説

ここからは、C# Functionの作り方を具体的なサンプルコードで見ていきます。最初はシンプルなメソッドから始め、少しずつ引数や戻り値を使った例に進みます。

3-1. 文字を表示するだけのシンプルな関数

まずは、文字を表示するだけのメソッドです。

C#
using System;

class Program
{
static void Main()
{
ShowMessage();
}

static void ShowMessage()
{
Console.WriteLine("C# Functionの基本を学習中です");
}
}

Mainメソッドの中でShowMessage()を呼び出しています。すると、ShowMessageメソッドの中に書かれた処理が実行されます。

実行結果は次のとおりです。

C#
C# Functionの基本を学習中です

このように、メソッドは「名前を付けた処理のまとまり」です。

3-2. 数値を計算して結果を返す関数

次に、数値を計算して結果を返すメソッドを作ってみましょう。

C#
using System;

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

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

Addメソッドは、int aint bを受け取り、足し算した結果を返します。

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

戻り値があるため、呼び出し元では次のように結果を変数に入れられます。

C#
int result = Add(10, 20);

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

C#
30

計算処理をメソッドに分けると、同じ計算を何度も使えるようになります。

3-3. 文字列を受け取って加工する関数

文字列を受け取って加工するメソッドもよく使います。

C#
using System;

class Program
{
static void Main()
{
string message = CreateGreeting("佐藤");
Console.WriteLine(message);
}

static string CreateGreeting(string name)
{
return "こんにちは、" + name + "さん";
}
}

CreateGreetingメソッドは、名前を受け取って挨拶文を作ります。

C#
static string CreateGreeting(string name)
{
return "こんにちは、" + name + "さん";
}

実行結果は次のとおりです。

C#
こんにちは、佐藤さん

文字列を加工するメソッドは、画面表示、メッセージ作成、入力チェックなどでよく使われます。

文字列補間を使うと、次のようにも書けます。

C#
static string CreateGreeting(string name)
{
return $"こんにちは、{name}さん";
}

こちらのほうが読みやすい場合も多いです。

3-4. Mainメソッドから自作関数を呼び出す方法

C#のコンソールアプリでは、プログラムの開始地点としてMainメソッドが使われます。自作したメソッドは、Mainメソッドから呼び出して実行できます。

C#
using System;

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

int total = Add(5, 7);
Console.WriteLine(total);
}

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

static int Add(int x, int y)
{
return x + y;
}
}

この例では、MainメソッドからSayHelloAddを呼び出しています。

C#
SayHello();
int total = Add(5, 7);

voidのメソッドは、呼び出すだけで処理を実行します。

戻り値があるメソッドは、戻ってきた値を変数に入れたり、別の処理に使ったりできます。

3-5. 関数を分けることでコードが読みやすくなる理由

すべての処理をMainメソッドに書くと、プログラムが長くなったときに読みにくくなります。

たとえば、次のようなコードは処理の流れがわかりにくくなりがちです。

C#
static void Main()
{
int price = 1000;
double taxRate = 0.1;
int tax = (int)(price * taxRate);
int total = price + tax;
Console.WriteLine(total);
}

メソッドに分けると、何をしているのかがわかりやすくなります。

C#
static void Main()
{
int total = CalculateTaxIncludedPrice(1000);
Console.WriteLine(total);
}

static int CalculateTaxIncludedPrice(int price)
{
double taxRate = 0.1;
int tax = (int)(price * taxRate);
return price + tax;
}

CalculateTaxIncludedPriceという名前を見るだけで、「税込価格を計算している」とわかります。

関数を分けるメリットは、単にコードが短くなることではありません。処理の意味が明確になり、修正やテストもしやすくなることが大きなメリットです。

4. 引数とは?C#の関数に値を渡す方法

引数とは、メソッドに渡す値のことです。C# Functionを使いこなすには、引数の理解が欠かせません。

たとえば、次のメソッドは名前を受け取って挨拶します。

C#
static void SayHello(string name)
{
Console.WriteLine("こんにちは、" + name + "さん");
}

呼び出すときは、次のように値を渡します。

C#
SayHello("山田");

この"山田"が引数です。

4-1. 引数とパラメーターの違い

「引数」と「パラメーター」は似た言葉ですが、厳密には少し違います。

メソッドを定義するときに書く変数をパラメーターと呼びます。

C#
static void SayHello(string name)
{
Console.WriteLine(name);
}

このnameがパラメーターです。

一方、メソッドを呼び出すときに渡す値を引数と呼びます。

C#
SayHello("山田");

この"山田"が引数です。

初心者のうちは、どちらも「メソッドに渡す値に関係するもの」と理解して問題ありません。ただし、正確に説明する場面では、定義側がパラメーター、呼び出し側が引数と覚えておくとよいでしょう。

4-2. 引数が1つの関数の書き方

引数が1つのメソッドは、次のように書きます。

C#
static void ShowName(string name)
{
Console.WriteLine("名前:" + name);
}

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

C#
ShowName("鈴木");

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

C#
名前:鈴木

数値を1つ受け取る例も見てみましょう。

C#
static int DoubleNumber(int number)
{
return number * 2;
}

呼び出し例です。

C#
int result = DoubleNumber(8);
Console.WriteLine(result);

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

C#
16

引数を使うと、同じメソッドでも渡す値によって結果を変えられます。

4-3. 引数が複数ある関数の書き方

引数が複数ある場合は、カンマで区切って書きます。

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

呼び出すときも、カンマで区切って値を渡します。

C#
int result = Add(3, 4);
Console.WriteLine(result);

実行結果は次のとおりです。

C#
7

文字列と数値のように、異なる型の引数を組み合わせることもできます。

C#
static void ShowUserInfo(string name, int age)
{
Console.WriteLine($"{name}さんは{age}歳です");
}

呼び出し例です。

C#
ShowUserInfo("田中", 25);

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

C#
田中さんは25歳です

引数が増えすぎるとメソッドが使いにくくなるため、必要な値だけを渡すようにしましょう。

4-4. 引数なしの関数の使い方

引数が不要なメソッドでは、かっこの中を空にします。

C#
static void ShowCurrentStatus()
{
Console.WriteLine("処理を開始します");
}

呼び出すときも、空のかっこを付けます。

C#
ShowCurrentStatus();

かっこを忘れるとメソッド呼び出しにならないため注意しましょう。

C#
// 正しい
ShowCurrentStatus();

// 誤り
ShowCurrentStatus;

引数なしのメソッドは、固定のメッセージを表示する処理や、決まった初期化処理などに使えます。

4-5. デフォルト引数と名前付き引数

C#では、引数に初期値を設定できます。これをデフォルト引数、または省略可能引数と呼びます。

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

このメソッドは、引数を渡さずに呼び出すこともできます。

C#
SayHello();
SayHello("佐藤");

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

C#
こんにちは、ゲストさん
こんにちは、佐藤さん

また、名前付き引数を使うと、どの引数に値を渡しているのかを明確にできます。

C#
static void ShowProfile(string name, int age)
{
Console.WriteLine($"{name}さんは{age}歳です");
}

名前付き引数で呼び出す例です。

C#
ShowProfile(name: "高橋", age: 30);

順番を入れ替えることもできます。

C#
ShowProfile(age: 30, name: "高橋");

引数が複数ある場合、名前付き引数を使うとコードが読みやすくなることがあります。

4-6. ref・out・in引数の基本

C#には、通常の引数以外にrefoutinという特殊な引数の渡し方があります。

refは、メソッドの中で引数の値を変更し、その変更を呼び出し元にも反映したいときに使います。

C#
static void AddTen(ref int number)
{
number += 10;
}

呼び出し例です。

C#
int value = 5;
AddTen(ref value);
Console.WriteLine(value);

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

C#
15

outは、メソッドの中で値を設定して呼び出し元に返したいときに使います。

C#
static void GetMinMax(int a, int b, out int min, out int max)
{
if (a < b)
{
min = a;
max = b;
}
else
{
min = b;
max = a;
}
}

呼び出し例です。

C#
GetMinMax(10, 3, out int minValue, out int maxValue);
Console.WriteLine(minValue);
Console.WriteLine(maxValue);

inは、値を参照として渡しつつ、メソッド内で変更させたくない場合に使います。

C#
static void ShowNumber(in int number)
{
Console.WriteLine(number);
}

初心者のうちは、まず通常の引数をしっかり理解しましょう。refoutinは、必要になったときに学べば大丈夫です。

5. 戻り値とは?C#の関数から結果を受け取る方法

戻り値とは、メソッドの処理結果として呼び出し元に返す値のことです。

たとえば、足し算をするメソッドでは、計算結果を戻り値として返します。

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

このメソッドは、a + bの結果を呼び出し元に返します。

5-1. 戻り値の基本とreturn文の使い方

戻り値があるメソッドでは、戻り値の型を指定し、return文で値を返します。

C#
static int GetNumber()
{
return 100;
}

呼び出し側では、戻り値を変数に入れられます。

C#
int number = GetNumber();
Console.WriteLine(number);

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

C#
100

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

C#
static int CheckNumber(int number)
{
if (number < 0)
{
return 0;
}

return number;
}

この例では、numberが0未満なら0を返してメソッドを終了します。そうでなければ、numberをそのまま返します。

5-2. int・string・boolを返す関数の例

C#では、さまざまな型を戻り値として返せます。

intを返す例です。

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

stringを返す例です。

C#
static string GetGreeting(string name)
{
return $"こんにちは、{name}さん";
}

boolを返す例です。

C#
static bool IsEven(int number)
{
return number % 2 == 0;
}

呼び出し例です。

C#
int total = Add(2, 3);
string message = GetGreeting("山田");
bool result = IsEven(10);

Console.WriteLine(total);
Console.WriteLine(message);
Console.WriteLine(result);

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

C#
5
こんにちは、山田さん
True

boolを返すメソッドは、条件判定でよく使います。

C#
if (IsEven(10))
{
Console.WriteLine("偶数です");
}

5-3. 戻り値なしのvoidとの違い

voidは、戻り値がないことを表します。

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

このメソッドは、何かの値を返すわけではありません。そのため、次のように変数へ代入することはできません。

C#
// エラー
int result = ShowMessage();

一方、戻り値があるメソッドは、結果を変数に入れられます。

C#
static int GetScore()
{
return 80;
}
C#
int score = GetScore();

voidは「処理を実行するだけ」、戻り値ありのメソッドは「処理した結果を返す」と考えるとわかりやすいです。

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

メソッドでは、条件によって返す値を変えられます。

C#
static string GetGrade(int score)
{
if (score >= 80)
{
return "A";
}
else if (score >= 60)
{
return "B";
}
else
{
return "C";
}
}

呼び出し例です。

C#
string grade = GetGrade(75);
Console.WriteLine(grade);

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

C#
B

returnが実行されると、その時点でメソッドの処理は終了します。そのため、次のようにelseを使わずに書くこともできます。

C#
static string GetGrade(int score)
{
if (score >= 80)
{
return "A";
}

if (score >= 60)
{
return "B";
}

return "C";
}

このような書き方は、条件が増えたときに読みやすくなる場合があります。

5-5. 複数の値を返したいときの方法

C#のメソッドは、基本的には1つの戻り値を返します。ただし、複数の値を返したい場合には、いくつかの方法があります。

代表的なのは、タプルを使う方法です。

C#
static (int min, int max) GetMinMax(int a, int b)
{
if (a < b)
{
return (a, b);
}

return (b, a);
}

呼び出し例です。

C#
var result = GetMinMax(10, 3);

Console.WriteLine(result.min);
Console.WriteLine(result.max);

また、分解して受け取ることもできます。

C#
var (min, max) = GetMinMax(10, 3);

Console.WriteLine(min);
Console.WriteLine(max);

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

C#
3
10

他にも、クラスを作って返す方法や、out引数を使う方法があります。初心者には、まずタプルを使う方法がわかりやすいでしょう。

6. staticメソッドとインスタンスメソッドの違い

C# Functionを学ぶときに、多くの初心者が混乱するのがstaticです。staticが付いているメソッドと、付いていないメソッドでは、呼び出し方が変わります。

6-1. staticとは何か

staticは、クラスそのものに属することを表します。

通常、C#ではクラスからオブジェクトを作って、そのオブジェクトのメソッドを呼び出します。

C#
User user = new User();
user.SayHello();

しかし、staticメソッドはオブジェクトを作らなくても呼び出せます。

C#
MathHelper.Add(1, 2);

初心者向けに簡単にいうと、staticメソッドは「インスタンスを作らずに使えるメソッド」です。

コンソールアプリの学習では、Mainメソッドがstaticなので、自作メソッドにもstaticを付けることがよくあります。

6-2. staticメソッドの作り方と呼び出し方

staticメソッドは、メソッド定義の先頭にstaticを付けて作ります。

C#
class Program
{
static void Main()
{
int result = Add(3, 5);
Console.WriteLine(result);
}

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

同じクラス内のstaticメソッドは、メソッド名だけで呼び出せます。

C#
Add(3, 5);

別のクラスにあるstaticメソッドを呼び出す場合は、クラス名を付けます。

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

呼び出し例です。

C#
int result = Calculator.Add(3, 5);

staticメソッドは、計算処理や共通処理など、特定のオブジェクトの状態に依存しない処理に向いています。

6-3. インスタンスメソッドの作り方と呼び出し方

staticが付いていないメソッドを、インスタンスメソッドと呼びます。

C#
class Person
{
public string Name;

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です");
}
}

インスタンスメソッドを呼び出すには、まずクラスからオブジェクトを作ります。

C#
Person person = new Person();
person.Name = "山田";
person.SayHello();

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

C#
こんにちは、山田です

インスタンスメソッドは、オブジェクトが持っているデータを使う処理に向いています。

この例では、personというオブジェクトが持つNameを使って挨拶しています。

6-4. 初心者はどちらを使えばよいか

初心者がコンソールアプリでC# Functionを練習する場合は、まずstaticメソッドから始めるとわかりやすいです。

C#
static void Main()
{
ShowMessage();
}

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

Mainメソッドがstaticなので、同じクラス内の自作メソッドもstaticにしておけば、スムーズに呼び出せます。

一方、クラスやオブジェクト指向を学び始めたら、インスタンスメソッドも使うようになります。

目安としては、特定のデータを持たない共通処理ならstatic、オブジェクトごとのデータを使う処理ならインスタンスメソッドと考えるとよいでしょう。

6-5. Mainメソッドがstaticである理由

Mainメソッドは、C#プログラムの開始地点です。プログラムが始まる時点では、まだProgramクラスのインスタンスは作られていません。

そのため、インスタンスを作らなくても呼び出せるように、Mainメソッドはstaticとして定義されます。

C#
static void Main()
{
Console.WriteLine("プログラム開始");
}

Mainstaticであるため、Mainから直接呼び出す自作メソッドもstaticでないとエラーになることがあります。

C#
class Program
{
static void Main()
{
SayHello(); // エラーになる
}

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

この場合は、SayHelloにもstaticを付けます。

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

または、Programクラスのインスタンスを作ってから呼び出します。

C#
Program program = new Program();
program.SayHello();

初心者のうちは、まずMainから呼び出すメソッドにはstaticを付けると覚えておくとよいでしょう。

7. C# Functionでよく使う応用パターン

基本的なメソッドの作り方に慣れてきたら、C# Functionの応用パターンも学んでいきましょう。ここでは、オーバーロード、ローカル関数、ラムダ式、非同期関数などを簡単に紹介します。

7-1. オーバーロードで同じ名前の関数を使い分ける

C#では、同じ名前のメソッドを複数定義できます。これをオーバーロードと呼びます。

ただし、引数の数や型が違う必要があります。

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

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

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

呼び出すときに渡した引数によって、どのメソッドが使われるかが決まります。

C#
Console.WriteLine(Add(1, 2));
Console.WriteLine(Add(1.5, 2.3));
Console.WriteLine(Add(1, 2, 3));

オーバーロードを使うと、同じ意味の処理を同じメソッド名でまとめられます。

ただし、違う役割の処理に同じ名前を使うと混乱するため、使いすぎには注意しましょう。

7-2. ローカル関数の使い方

C#では、メソッドの中にメソッドのような処理を書くことができます。これをローカル関数と呼びます。

C#
static void Main()
{
int result = AddAndDouble(3, 4);
Console.WriteLine(result);

int AddAndDouble(int a, int b)
{
return (a + b) * 2;
}
}

AddAndDoubleMainメソッドの中だけで使える関数です。

ローカル関数は、特定のメソッド内でしか使わない補助的な処理を書くときに便利です。

たとえば、ある処理の中だけで入力チェックをしたい場合などに使えます。

C#
static void RegisterUser(string name)
{
if (!IsValidName(name))
{
Console.WriteLine("名前が不正です");
return;
}

Console.WriteLine("登録しました");

bool IsValidName(string value)
{
return !string.IsNullOrWhiteSpace(value);
}
}

ローカル関数を使うと、外部から呼び出す必要がない処理を隠せるため、コードの見通しがよくなります。

7-3. ラムダ式とFuncデリゲートの基本

C#には、ラムダ式という短い関数のような書き方があります。

C#
Func<int, int, int> add = (a, b) => a + b;

この例では、addという変数に、2つの整数を受け取って足し算する処理を入れています。

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

C#
int result = add(3, 5);
Console.WriteLine(result);

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

C#
8

Func<int, int, int>は、最初の2つのintが引数の型、最後のintが戻り値の型です。

つまり、次のような意味です。

C#
Func<第1引数の型, 第2引数の型, 戻り値の型>

引数が1つの場合は、次のように書きます。

C#
Func<int, int> square = x => x * x;
Console.WriteLine(square(4));

ラムダ式は、LINQやイベント処理、コールバック処理などでよく使われます。初心者のうちは、通常のメソッドに慣れてから学ぶと理解しやすいです。

7-4. 非同期関数async/awaitの基本

C#では、時間のかかる処理を非同期で実行するためにasyncawaitを使います。

たとえば、データ取得やファイル読み込み、Web APIへのアクセスなどでは、処理が終わるまで待つ必要があります。このとき、アプリ全体を止めないように非同期処理を使います。

基本的な形は次のとおりです。

C#
static async Task Main()
{
string message = await GetMessageAsync();
Console.WriteLine(message);
}

static async Task<string> GetMessageAsync()
{
await Task.Delay(1000);
return "処理が完了しました";
}

asyncは、そのメソッドが非同期処理を含むことを表します。

awaitは、非同期処理の完了を待つために使います。

Task<string>は、将来的にstring型の結果を返す非同期処理を表します。

戻り値がない非同期メソッドでは、通常Taskを使います。

C#
static async Task ShowMessageAsync()
{
await Task.Delay(1000);
Console.WriteLine("こんにちは");
}

非同期関数は少し難しいですが、実務ではよく使われます。まずは通常のメソッド、戻り値、引数を理解してから学ぶとよいでしょう。

7-5. クラス内で関数を整理する方法

C#では、メソッドは基本的にクラスの中に書きます。プログラムが大きくなってきたら、役割ごとにクラスを分けてメソッドを整理します。

たとえば、計算に関する処理はCalculatorクラスにまとめます。

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

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

使う側は次のようになります。

C#
Calculator calculator = new Calculator();

int sum = calculator.Add(10, 5);
int diff = calculator.Subtract(10, 5);

Console.WriteLine(sum);
Console.WriteLine(diff);

消費税の計算だけをまとめるなら、次のようなクラスも考えられます。

C#
class TaxCalculator
{
public int CalculateTaxIncludedPrice(int price)
{
return (int)(price * 1.1);
}
}

クラス名とメソッド名をわかりやすくすることで、コード全体の見通しがよくなります。

8. C# Functionでよくあるエラーと対処法

C# Functionを学習していると、メソッド定義や呼び出しでエラーが出ることがあります。ここでは、初心者がよく遭遇するエラーと対処法を紹介します。

8-1. returnを書き忘れた場合のエラー

戻り値があるメソッドでは、必ず値を返す必要があります。

C#
static int Add(int a, int b)
{
int result = a + b;
}

このコードはエラーになります。戻り値の型がintなのに、returnで値を返していないためです。

正しくは次のように書きます。

C#
static int Add(int a, int b)
{
int result = a + b;
return result;
}

または、短く書くこともできます。

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

戻り値が不要な場合は、戻り値の型をvoidにします。

C#
static void ShowResult(int a, int b)
{
Console.WriteLine(a + b);
}

8-2. 引数の数や型が合わない場合のエラー

メソッドを呼び出すときは、定義された引数の数と型に合わせる必要があります。

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

このメソッドは、int型の引数を2つ受け取ります。

そのため、次の呼び出しは正しいです。

C#
int result = Add(3, 5);

しかし、次のような呼び出しはエラーになります。

C#
Add(3);
Add(3, 5, 7);
Add("3", "5");

引数が足りない、引数が多い、型が違う場合はエラーになります。

エラーが出たら、メソッド定義と呼び出し側を見比べて、引数の数と型が一致しているか確認しましょう。

8-3. staticでないメソッドを呼び出せない場合のエラー

staticメソッドから、staticでないメソッドをそのまま呼び出すとエラーになります。

C#
class Program
{
static void Main()
{
ShowMessage(); // エラー
}

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

この場合、ShowMessagestaticにすれば解決できます。

C#
class Program
{
static void Main()
{
ShowMessage();
}

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

または、インスタンスを作って呼び出します。

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

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

初心者のうちは、Mainから直接呼ぶメソッドにはstaticを付けると覚えておくとよいでしょう。

8-4. メソッド名のスペルミスによるエラー

メソッド名を間違えると、C#はそのメソッドを見つけられません。

C#
static void Main()
{
ShowMesage(); // スペルミス
}

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

この例では、呼び出し側がShowMesageになっていますが、定義されているメソッド名はShowMessageです。

正しくは次のように書きます。

C#
ShowMessage();

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

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

メソッド名のエラーが出たときは、スペル、大文字小文字、かっこの有無を確認しましょう。

8-5. スコープ外で関数を呼び出した場合のエラー

メソッドや変数には、使える範囲があります。この範囲をスコープと呼びます。

たとえば、ローカル関数は定義されたメソッドの中でしか使えません。

C#
static void Main()
{
ShowLocal();

void ShowLocal()
{
Console.WriteLine("ローカル関数です");
}
}

このShowLocalは、Mainメソッドの中だけで使えます。別のメソッドから呼び出すことはできません。

C#
static void Other()
{
ShowLocal(); // エラー
}

また、クラスの外に通常のメソッドを直接書くこともできません。

C#
// 基本的にはクラスの中に書く
class Program
{
static void ShowMessage()
{
Console.WriteLine("こんにちは");
}
}

エラーが出たときは、メソッドを呼び出している場所から、そのメソッドが見えるかどうかを確認しましょう。

9. C# Functionの実践例

ここでは、C# Functionの実践例を紹介します。実際のプログラムでよく使う、消費税計算、偶数・奇数判定、入力チェック、配列やリストの処理を見ていきましょう。

9-1. 消費税を計算する関数

消費税を計算するメソッドの例です。

C#
static int CalculateTaxIncludedPrice(int price)
{
return (int)(price * 1.1);
}

呼び出し例です。

C#
int total = CalculateTaxIncludedPrice(1000);
Console.WriteLine(total);

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

C#
1100

税率を引数で受け取るようにすると、より柔軟になります。

C#
static int CalculateTaxIncludedPrice(int price, double taxRate)
{
return (int)(price * (1 + taxRate));
}

呼び出し例です。

C#
int total = CalculateTaxIncludedPrice(1000, 0.1);
Console.WriteLine(total);

このようにメソッド化しておくと、税率が変わった場合でも修正箇所を少なくできます。

9-2. 偶数・奇数を判定する関数

数値が偶数かどうかを判定するメソッドです。

C#
static bool IsEven(int number)
{
return number % 2 == 0;
}

呼び出し例です。

C#
int number = 10;

if (IsEven(number))
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}

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

C#
偶数です

奇数かどうかを判定するメソッドも作れます。

C#
static bool IsOdd(int number)
{
return number % 2 != 0;
}

boolを返すメソッドは、if文と相性がよく、条件判定をわかりやすく書けます。

9-3. 入力値をチェックする関数

ユーザーが入力した値をチェックする処理も、メソッドにすると便利です。

C#
static bool IsValidName(string name)
{
return !string.IsNullOrWhiteSpace(name);
}

このメソッドは、名前が空文字や空白だけでないかをチェックします。

呼び出し例です。

C#
string name = "";

if (IsValidName(name))
{
Console.WriteLine("有効な名前です");
}
else
{
Console.WriteLine("名前を入力してください");
}

年齢のチェックもメソッドにできます。

C#
static bool IsValidAge(int age)
{
return age >= 0 && age <= 120;
}

呼び出し例です。

C#
if (IsValidAge(25))
{
Console.WriteLine("有効な年齢です");
}

入力チェックをメソッドに分けると、同じチェックを複数の場所で使い回せます。

9-4. 配列やリストを処理する関数

配列を受け取って合計を計算するメソッドです。

C#
static int SumArray(int[] numbers)
{
int total = 0;

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

return total;
}

呼び出し例です。

C#
int[] scores = { 80, 90, 70 };

int total = SumArray(scores);
Console.WriteLine(total);

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

C#
240

リストを処理するメソッドも作れます。

C#
static void ShowNames(List<string> names)
{
foreach (string name in names)
{
Console.WriteLine(name);
}
}

呼び出し例です。

C#
List<string> names = new List<string> { "田中", "佐藤", "鈴木" };

ShowNames(names);

配列やリストを処理する関数は、実務でもよく使います。データの合計、検索、絞り込み、変換など、さまざまな場面で役立ちます。

9-5. 実務で関数を使う場面

実務でC# Function、つまりメソッドを使う場面は非常に多いです。

たとえば、次のような処理はメソッドに分けることがよくあります。

入力値をチェックする処理、計算処理、文字列を整形する処理、データベースに保存する処理、ファイルを読み書きする処理、APIからデータを取得する処理、画面に表示するデータを作る処理などです。

たとえば、ユーザー登録処理では、次のように役割を分けられます。

C#
static void RegisterUser(string name, int age)
{
if (!IsValidName(name))
{
Console.WriteLine("名前が不正です");
return;
}

if (!IsValidAge(age))
{
Console.WriteLine("年齢が不正です");
return;
}

SaveUser(name, age);
}

static bool IsValidName(string name)
{
return !string.IsNullOrWhiteSpace(name);
}

static bool IsValidAge(int age)
{
return age >= 0 && age <= 120;
}

static void SaveUser(string name, int age)
{
Console.WriteLine($"{name}さんを保存しました");
}

このように処理を分けると、コードの役割が明確になります。

RegisterUserは登録全体の流れを担当し、IsValidNameIsValidAgeはチェックを担当し、SaveUserは保存処理を担当します。

実務では、このように小さなメソッドを組み合わせて大きな処理を作っていきます。

10. C# Functionに関するよくある質問

最後に、C# Functionに関するよくある質問をまとめます。

10-1. C#にfunctionという書き方はある?

C#には、JavaScriptのようなfunctionキーワードはありません。

JavaScriptでは次のように書きます。

JavaScript
function hello() {
console.log("Hello");
}

C#では次のようにメソッドとして書きます。

C#
static void Hello()
{
Console.WriteLine("Hello");
}

C#で関数を作りたい場合は、戻り値の型、メソッド名、引数リストを使ってメソッドを定義します。

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

そのため、「C# Function」と検索している場合は、「C# メソッド」と読み替えると理解しやすいです。

10-2. 関数とメソッドは何が違う?

一般的な意味では、関数は「処理をまとめて名前を付けたもの」です。

一方、C#のメソッドは、クラスや構造体などに属する処理のまとまりです。

C#では、基本的に処理はクラスの中にメソッドとして定義します。

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

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

初心者のうちは、「C#では関数のようなものをメソッドと呼ぶ」と理解しておけば大丈夫です。

10-3. voidとreturnはどう使い分ける?

voidは、戻り値がないメソッドに使います。

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

このメソッドは、画面に文字を表示するだけで、呼び出し元に値を返しません。

一方、returnは、メソッドから値を返すときに使います。

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

このメソッドは、足し算した結果を返します。

目安としては、処理を実行するだけならvoid、結果をあとで使いたいなら戻り値ありのメソッドにします。

C#
// 表示するだけ
static void ShowTotal(int total)
{
Console.WriteLine(total);
}

// 計算結果を返す
static int CalculateTotal(int price, int fee)
{
return price + fee;
}

10-4. 関数はどこに書けばよい?

C#のメソッドは、基本的にクラスの中に書きます。

C#
class Program
{
static void Main()
{
SayHello();
}

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

Mainメソッドと同じクラス内に書けば、初心者でも呼び出しやすいです。

プログラムが大きくなってきたら、役割ごとにクラスを分けます。

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

また、特定のメソッドの中だけで使う補助処理であれば、ローカル関数として書くこともできます。

C#
static void Main()
{
int result = Double(5);
Console.WriteLine(result);

int Double(int number)
{
return number * 2;
}
}

まずは、Programクラスの中にstaticメソッドとして書く練習から始めるとよいでしょう。

10-5. 初心者が次に学ぶべきC#の文法は?

C# Function、つまりメソッドの基本を理解したら、次に学ぶべき文法は次のようなものです。

まずは、クラスとインスタンスです。C#はオブジェクト指向の言語なので、クラスを理解するとメソッドの使い方もより深くわかります。

次に、プロパティを学ぶとよいでしょう。クラスが持つデータを扱うために重要です。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

その次に、配列、リスト、LINQを学ぶと、複数のデータを効率よく処理できるようになります。

また、例外処理も重要です。

C#
try
{
int number = int.Parse("abc");
}
catch
{
Console.WriteLine("数値に変換できません");
}

さらに、ファイル操作、非同期処理、データベース接続などを学ぶと、実用的なアプリケーションを作れるようになります。

まとめ

C# Functionとは、C#で処理をひとまとまりにして再利用できるようにする仕組みを指す言葉として使われることが多いです。ただし、C#では正確には「関数」ではなく「メソッド」と呼びます。

C#にはJavaScriptのようなfunctionキーワードはありません。メソッドは、戻り値の型、メソッド名、引数リストを使って定義します。

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

戻り値がない場合はvoidを使います。

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

引数を使うと、メソッドに値を渡せます。戻り値を使うと、処理結果を呼び出し元で受け取れます。

また、staticメソッドとインスタンスメソッドの違いも重要です。初心者がコンソールアプリで練習する場合は、まずstaticメソッドから始めると理解しやすいでしょう。

C# Functionを使えるようになると、コードの重複を減らし、読みやすく、修正しやすいプログラムを書けるようになります。最初はシンプルなメソッドから始めて、引数、戻り値、オーバーロード、ローカル関数、ラムダ式、非同期処理へと少しずつ学習を進めていきましょう。