C#のvoidとは?戻り値なしメソッドの意味・使い方・エラー原因を初心者向けに解説
はじめに
C#を学び始めると、メソッドの定義でよく出てくるのがvoidです。
C#void SayHello()
{
Console.WriteLine("こんにちは");
}
このvoidは、C#のメソッドを理解するうえで非常に重要なキーワードです。特に初心者のうちは、「なぜvoidを書くのか」「intやstringとは何が違うのか」「returnは使えるのか」と迷いやすい部分でもあります。
結論からいうと、C#のvoidは戻り値がないメソッドを表すために使います。つまり、処理は実行するけれど、呼び出し元に値を返さないメソッドです。
この記事では、C#のvoidの意味、基本的な書き方、使い方、returnとの関係、よくあるエラー原因、async voidとの違いまで、初心者向けにわかりやすく解説します。
1. C#のvoidとは?戻り値がないことを表すキーワード
C#のvoidとは、メソッドが値を返さないことを示すキーワードです。
C#では、メソッドを定義するときに「そのメソッドがどの型の値を返すのか」を書く必要があります。たとえば、数値を返すならint、文字列を返すならstring、真偽値を返すならboolを使います。
一方で、何も値を返さないメソッドではvoidを使います。
C#void PrintMessage()
{
Console.WriteLine("メッセージを表示します");
}
このメソッドは、画面に文字を表示する処理を行いますが、呼び出し元に値は返しません。そのため、戻り値の型としてvoidを指定します。
1-1. voidの意味は「何も返さない」
voidは英語で「空の」「無効の」「何もない」といった意味を持ちます。C#では、メソッドの戻り値がないことを表します。
たとえば、次のメソッドを見てみましょう。
C#void Greet()
{
Console.WriteLine("こんにちは");
}
このGreetメソッドは、呼び出されると「こんにちは」と表示します。しかし、表示したあとに何かの値を返すわけではありません。
呼び出し方は次のようになります。
C#Greet();
このように、voidメソッドは「処理を実行するため」に呼び出します。戻ってくる値を受け取ることはできません。
1-2. メソッドの戻り値とは何か
戻り値とは、メソッドの処理が終わったあとに、呼び出し元へ返す値のことです。
たとえば、次のメソッドは2つの数値を足した結果を返します。
C#int Add(int a, int b)
{
return a + b;
}
このメソッドはint型の値を返すため、戻り値の型にintを指定しています。
C#int result = Add(3, 5);
Console.WriteLine(result);
実行すると、8が表示されます。
このように、メソッドの結果をあとで使いたい場合は戻り値が必要です。一方で、結果を返す必要がなく、処理だけを実行したい場合はvoidを使います。
1-3. voidを使う場面と使わない場面
voidを使うのは、メソッドの目的が「値を返すこと」ではなく「処理を実行すること」の場合です。
たとえば、次のような処理ではvoidがよく使われます。
画面に文字を表示する処理、データを保存する処理、設定を変更する処理、リストに要素を追加する処理、ログを出力する処理などです。
C#void SaveData()
{
Console.WriteLine("データを保存しました");
}
このメソッドは、保存処理を行うことが目的であり、保存結果の値を返していません。そのためvoidで定義できます。
一方で、次のような場合はvoidではなく戻り値ありのメソッドにします。
計算結果を返したい場合、文字列を作って返したい場合、条件判定の結果を返したい場合、取得したデータを呼び出し元で使いたい場合です。
C#int GetPrice()
{
return 1000;
}
このように、呼び出し元で値を使いたいならvoidではなく、適切な戻り値の型を指定します。
1-4. int・string・boolなど戻り値ありメソッドとの違い
voidメソッドと、int・string・boolなどの戻り値ありメソッドの違いは、値を返すかどうかです。
C#void ShowName()
{
Console.WriteLine("田中");
}
このメソッドは名前を表示するだけで、値は返しません。
一方、次のメソッドは文字列を返します。
C#string GetName()
{
return "田中";
}
この場合、戻り値を変数に代入できます。
C#string name = GetName();
Console.WriteLine(name);
boolを返すメソッドなら、条件分岐に使えます。
C#bool IsAdult(int age)
{
return age >= 20;
}
C#if (IsAdult(25))
{
Console.WriteLine("成人です");
}
voidは戻り値がないため、変数に代入したり、条件式の中で使ったりすることはできません。
2. voidメソッドの基本的な書き方
C#でvoidメソッドを書くには、戻り値の型を書く場所にvoidを指定します。
基本形を覚えておけば、さまざまな処理をメソッドとして分けられるようになります。
2-1. voidメソッドの構文
voidメソッドの基本的な構文は次のとおりです。
C#void メソッド名()
{
処理;
}
たとえば、メッセージを表示するメソッドは次のように書けます。
C#void ShowMessage()
{
Console.WriteLine("処理を実行しました");
}
メソッドを呼び出すときは、メソッド名に丸括弧を付けます。
C#ShowMessage();
クラスの中で書く場合は、次のような形になります。
C#class Program
{
static void Main()
{
ShowMessage();
}
static void ShowMessage()
{
Console.WriteLine("処理を実行しました");
}
}
ここではMainメソッドからShowMessageメソッドを呼び出しています。どちらも戻り値がないため、voidが使われています。
2-2. 引数なしのvoidメソッドの例
引数なしのvoidメソッドは、外部から値を受け取らずに決まった処理を実行します。
C#void PrintLine()
{
Console.WriteLine("----------------");
}
このメソッドを使うと、区切り線を何度でも表示できます。
C#PrintLine();
Console.WriteLine("メニュー");
PrintLine();
実行結果は次のようになります。
C#----------------
メニュー
----------------
同じ処理を何度も書く代わりにメソッド化することで、コードが読みやすくなります。
2-3. 引数ありのvoidメソッドの例
voidメソッドでも、引数を受け取ることはできます。戻り値がないだけで、メソッドに値を渡して処理することは可能です。
C#void PrintName(string name)
{
Console.WriteLine("名前は" + name + "です");
}
呼び出すときは、引数に文字列を渡します。
C#PrintName("佐藤");
PrintName("鈴木");
実行結果は次のようになります。
C#名前は佐藤です
名前は鈴木です
数値を受け取ることもできます。
C#void ShowScore(int score)
{
Console.WriteLine("点数は" + score + "点です");
}
C#ShowScore(80);
このように、voidメソッドは値を返しませんが、引数を使って柔軟に処理を変えることができます。
2-4. Mainメソッドで使われるvoidの意味
C#の基本的なプログラムでは、Mainメソッドにvoidが使われることがあります。
C#static void Main()
{
Console.WriteLine("Hello, World!");
}
このvoidは、Mainメソッドが戻り値を返さないことを意味します。
Mainメソッドはプログラムの開始地点です。プログラムを実行すると、基本的にこのMainメソッドから処理が始まります。
なお、C#では次のようにintを返すMainメソッドを書くこともできます。
C#static int Main()
{
Console.WriteLine("Hello, World!");
return 0;
}
この場合、プログラムの終了コードとして整数を返します。ただし、初心者が通常の学習でよく見るのはstatic void Main()の形です。
3. voidメソッドの使い方を初心者向けに解説
voidメソッドは、実際のプログラムで非常によく使われます。
特に、画面表示、データ更新、ファイル保存、ログ出力など、「何かを実行すること」が目的の処理に向いています。
3-1. 画面に文字を表示する処理
もっともわかりやすいvoidメソッドの例は、画面に文字を表示する処理です。
C#void ShowWelcomeMessage()
{
Console.WriteLine("ようこそ");
Console.WriteLine("C#の学習を始めましょう");
}
このメソッドは、呼び出すと2行のメッセージを表示します。
C#ShowWelcomeMessage();
戻り値はありません。表示すること自体が目的なので、voidが適しています。
複数の場所で同じメッセージを表示したい場合にも、メソッド化しておくと便利です。
3-2. 値を変更・更新する処理
voidメソッドは、変数やオブジェクトの状態を変更する処理でも使われます。
たとえば、クラスのフィールドを更新するメソッドです。
C#class User
{
public string Name;
public void ChangeName(string newName)
{
Name = newName;
}
}
使い方は次のとおりです。
C#User user = new User();
user.Name = "田中";
user.ChangeName("佐藤");
Console.WriteLine(user.Name);
実行結果は次のようになります。
C#佐藤
ChangeNameメソッドは、新しい名前を返しているわけではありません。オブジェクトの状態を変更しているだけです。そのため、戻り値はvoidです。
3-3. ファイル保存やデータ登録など結果を返さない処理
ファイル保存やデータ登録のように、処理の実行そのものが目的の場合にもvoidが使われます。
C#void SaveFile(string text)
{
File.WriteAllText("sample.txt", text);
}
このメソッドは、受け取った文字列をファイルに保存します。保存した内容を戻り値として返してはいないため、voidで定義できます。
データ登録の処理も同様です。
C#void RegisterUser(string name)
{
Console.WriteLine(name + "を登録しました");
}
このような処理では、「登録できたかどうか」を返す設計にする場合もあります。その場合はboolなどを戻り値にすることもあります。
C#bool RegisterUser(string name)
{
if (string.IsNullOrEmpty(name))
{
return false;
}
Console.WriteLine(name + "を登録しました");
return true;
}
つまり、結果を呼び出し元で使いたいなら戻り値あり、処理だけでよいならvoidという考え方です。
3-4. 戻り値が必要ない処理をメソッド化するメリット
戻り値がない処理でも、メソッド化するメリットは多くあります。
まず、同じ処理を何度も書かずに済みます。
C#void PrintMenu()
{
Console.WriteLine("1. 登録");
Console.WriteLine("2. 更新");
Console.WriteLine("3. 削除");
}
メニュー表示を何度も使う場合、毎回Console.WriteLineを書くよりも、PrintMenu()を呼び出すほうが簡単です。
次に、コードの意味がわかりやすくなります。
C#PrintMenu();
InputUserName();
SaveUserData();
このようにメソッド名を見るだけで、何をしている処理なのか理解しやすくなります。
また、処理を分けることで修正もしやすくなります。表示内容を変えたい場合は、メソッドの中だけを修正すればよいからです。
4. voidメソッドでreturnは使える?使えない?
voidメソッドでは、returnの使い方に注意が必要です。
結論として、voidメソッドでは値を返すreturn 値;は使えません。ただし、処理を途中で終了するためのreturn;は使えます。
4-1. voidメソッドでは値をreturnできない
voidは「戻り値がない」という意味なので、値を返すことはできません。
次のコードはエラーになります。
C#void GetNumber()
{
return 10;
}
このメソッドはvoidとして定義されているのに、return 10;で整数を返そうとしています。
戻り値を返したい場合は、メソッドの戻り値の型をintに変更する必要があります。
C#int GetNumber()
{
return 10;
}
voidメソッドでは、returnの後ろに値を書かないようにしましょう。
4-2. return;だけなら処理の途中終了に使える
voidメソッドでも、return;だけなら使えます。
C#void CheckAge(int age)
{
if (age < 0)
{
Console.WriteLine("年齢が正しくありません");
return;
}
Console.WriteLine("年齢は" + age + "歳です");
}
このメソッドでは、ageが負の数だった場合、エラーメッセージを表示してreturn;で処理を終了しています。
C#CheckAge(-1);
実行すると、次のようになります。
C#年齢が正しくありません
return;以降の処理は実行されません。
このように、voidメソッドのreturn;は「値を返す」のではなく、「ここでメソッドを終了する」という意味で使います。
4-3. return 値;を書いたときに起きるエラー
voidメソッドでreturn 値;を書くと、コンパイルエラーになります。
C#void CreateMessage()
{
return "こんにちは";
}
このコードでは、voidメソッドなのに文字列を返そうとしているためエラーになります。
修正方法は2つあります。
1つ目は、値を返す必要がないならreturnの値を消す方法です。
C#void CreateMessage()
{
Console.WriteLine("こんにちは");
return;
}
または、return;自体を省略してもかまいません。
C#void CreateMessage()
{
Console.WriteLine("こんにちは");
}
2つ目は、値を返したいなら戻り値の型を変更する方法です。
C#string CreateMessage()
{
return "こんにちは";
}
どちらに修正するかは、そのメソッドの目的によって決めます。
4-4. 戻り値を返したい場合の修正方法
戻り値を返したい場合は、voidを適切な型に変更します。
たとえば、合計値を返したいならintにします。
C#int Add(int a, int b)
{
return a + b;
}
文字列を返したいならstringにします。
C#string GetGreeting()
{
return "こんにちは";
}
判定結果を返したいならboolにします。
C#bool IsEven(int number)
{
return number % 2 == 0;
}
戻り値ありのメソッドでは、基本的にすべての実行経路で値を返す必要があります。
C#int GetScore(bool passed)
{
if (passed)
{
return 100;
}
return 0;
}
voidから戻り値ありに変更するときは、returnで返す値の型が、メソッドの戻り値の型と一致しているか確認しましょう。
5. voidでよくあるエラー原因と対処法
C#初心者がvoidでつまずきやすいのは、戻り値がないメソッドを「値が返ってくるもの」として扱ってしまうケースです。
ここでは、よくあるエラー原因と対処法を見ていきます。
5-1. 「void型を変数に代入できない」エラー
voidメソッドの結果を変数に代入しようとするとエラーになります。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
string message = ShowMessage();
ShowMessageメソッドは値を返さないため、string messageに代入できません。
正しい呼び出し方は次のとおりです。
C#ShowMessage();
値を代入したい場合は、メソッドを戻り値ありに変更します。
C#string GetMessage()
{
return "こんにちは";
}
string message = GetMessage();
voidメソッドは、変数に入れるものではなく、単独で呼び出して処理を実行するものだと覚えておきましょう。
5-2. 「戻り値が必要です」と表示される原因
戻り値ありのメソッドでreturnを書き忘れると、「戻り値が必要です」という意味のエラーが発生します。
C#int GetNumber()
{
Console.WriteLine("数値を取得します");
}
このメソッドはintを返すと宣言しているのに、returnで整数を返していません。
修正するには、returnを追加します。
C#int GetNumber()
{
Console.WriteLine("数値を取得します");
return 10;
}
もし値を返す必要がないなら、戻り値の型をvoidに変更します。
C#void GetNumber()
{
Console.WriteLine("数値を取得します");
}
エラーが出たときは、「このメソッドは値を返すべきなのか」「処理だけでよいのか」を考えましょう。
5-3. voidメソッドの結果をConsole.WriteLineで表示しようとした場合
voidメソッドをConsole.WriteLineの中で呼び出そうとするとエラーになります。
C#void SayHello()
{
Console.WriteLine("こんにちは");
}
Console.WriteLine(SayHello());
SayHello()は戻り値がないため、Console.WriteLineに渡す値がありません。
正しくは、次のように単独で呼び出します。
C#SayHello();
すでにSayHelloメソッドの中でConsole.WriteLineを実行しているため、外側でもう一度Console.WriteLineする必要はありません。
もしConsole.WriteLineで表示したい文字列をメソッドから受け取りたいなら、戻り値をstringにします。
C#string GetHello()
{
return "こんにちは";
}
Console.WriteLine(GetHello());
この違いは初心者が非常に間違えやすいポイントです。
5-4. メソッド名・戻り値の型・呼び出し方の確認ポイント
void関連のエラーが出たときは、次の3点を確認すると原因を見つけやすくなります。
まず、メソッドの戻り値の型を確認します。
C#void ShowMessage()
このようにvoidなら、値は返りません。
次に、returnの書き方を確認します。
C#return;
voidメソッドで使えるのは、値なしのreturn;だけです。
C#return 10;
このように値を返す書き方はできません。
最後に、呼び出し方を確認します。
C#ShowMessage();
voidメソッドはこのように単独で呼び出します。
C#var result = ShowMessage();
Console.WriteLine(ShowMessage());
このように、変数に代入したり、別のメソッドの引数として値のように扱ったりすることはできません。
6. voidとreturnありメソッドの使い分け
voidにするか、戻り値ありのメソッドにするかは、メソッドの目的によって決めます。
大切なのは、「そのメソッドを呼び出したあとに、結果の値を使いたいかどうか」です。
6-1. 処理だけ実行したい場合はvoid
処理だけ実行できればよい場合はvoidを使います。
C#void PrintError()
{
Console.WriteLine("エラーが発生しました");
}
このメソッドはエラーメッセージを表示するだけです。呼び出し元で何か値を受け取る必要はありません。
C#PrintError();
他にも、次のような処理はvoidに向いています。
ログを出力する、画面表示を更新する、データを保存する、設定を変更する、通知を送るなどです。
ただし、処理が成功したかどうかを呼び出し元で判断したい場合は、boolなどの戻り値を使うことも検討します。
6-2. 計算結果や判定結果が必要な場合は戻り値あり
計算結果や判定結果を呼び出し元で使いたい場合は、戻り値ありのメソッドにします。
C#int Multiply(int a, int b)
{
return a * b;
}
C#int result = Multiply(4, 5);
Console.WriteLine(result);
このように、計算結果を変数に入れて使いたい場合はvoidでは不適切です。
条件判定にも戻り値ありのメソッドが向いています。
C#bool IsLogin(string userName)
{
return userName == "admin";
}
C#if (IsLogin("admin"))
{
Console.WriteLine("ログイン成功");
}
boolを返すことで、if文の条件として使えるようになります。
6-3. voidにするか戻り値ありにするかの判断基準
voidにするか戻り値ありにするか迷ったら、次のように考えると判断しやすくなります。
そのメソッドの目的が、表示、保存、更新、登録、削除などの「処理の実行」であればvoidが向いています。
C#void Save()
{
Console.WriteLine("保存しました");
}
一方で、そのメソッドの目的が、計算、取得、作成、判定などの「値を返すこと」であれば戻り値ありにします。
C#int CalculateTotal()
{
return 1000;
}
メソッド名も判断のヒントになります。
Show、Print、Save、Update、Deleteなどはvoidになりやすいです。
Get、Create、Calculate、Is、Hasなどは戻り値ありになりやすいです。
ただし、これは絶対的なルールではありません。実際には、そのメソッドを呼び出した側で値を必要とするかどうかを基準に考えます。
6-4. 初心者が迷いやすい使い分け例
初心者が迷いやすい例として、メッセージを「表示する」のか「作って返す」のかという違いがあります。
表示するだけならvoidです。
C#void ShowGreeting()
{
Console.WriteLine("こんにちは");
}
文字列を作って呼び出し元で使いたいならstringです。
C#string GetGreeting()
{
return "こんにちは";
}
合計を画面に表示するだけならvoidでも書けます。
C#void ShowTotal(int a, int b)
{
Console.WriteLine(a + b);
}
合計値をあとで別の計算に使いたいならintを返します。
C#int GetTotal(int a, int b)
{
return a + b;
}
この2つは似ていますが、役割が違います。
ShowTotalは表示するためのメソッド、GetTotalは合計値を取得するためのメソッドです。
処理の目的をはっきりさせると、voidにするべきか戻り値ありにするべきか判断しやすくなります。
7. async voidとは?通常のvoidとの違い
C#では、非同期処理でasync voidという書き方を見ることがあります。
C#async void Button_Click(object sender, EventArgs e)
{
await Task.Delay(1000);
Console.WriteLine("クリックされました");
}
async voidは、通常のvoidと同じく戻り値を返しませんが、非同期処理を含む点が異なります。
ただし、async voidは使いどころに注意が必要です。
7-1. async voidの基本的な意味
async voidは、非同期メソッドで戻り値がないことを表します。
C#async void DoWork()
{
await Task.Delay(1000);
Console.WriteLine("処理完了");
}
asyncは、そのメソッドの中でawaitを使えるようにするためのキーワードです。
Task.Delay(1000)は、1秒待つ非同期処理です。
このメソッドは、非同期で処理を行いますが、呼び出し元に結果を返しません。そのため、戻り値がvoidになっています。
ただし、通常のメソッドで安易にasync voidを使うのはおすすめされません。
7-2. async Taskとの違い
非同期メソッドでは、async voidよりもasync Taskがよく使われます。
C#async Task DoWorkAsync()
{
await Task.Delay(1000);
Console.WriteLine("処理完了");
}
async Taskは、戻り値としてTaskを返します。Taskは非同期処理そのものを表す型です。
呼び出し側では、次のようにawaitできます。
C#await DoWorkAsync();
一方、async voidは戻り値がないため、呼び出し側でawaitできません。
C#DoWork();
つまり、async Taskは「非同期処理の完了を待てる」のに対し、async voidは「呼び出したあとの完了を扱いにくい」という違いがあります。
7-3. async voidはイベントハンドラー以外では避ける理由
async voidは、主にイベントハンドラーで使われます。
C#async void Button_Click(object sender, EventArgs e)
{
await Task.Delay(1000);
Console.WriteLine("ボタンがクリックされました");
}
イベントハンドラーは、戻り値の型がvoidとして決まっていることが多いため、async voidを使う場面があります。
しかし、通常の非同期メソッドではasync Taskを使うのが基本です。
理由は、async voidでは呼び出し元が処理の完了を待てず、例外処理もしにくくなるためです。
C#async Task LoadDataAsync()
{
await Task.Delay(1000);
Console.WriteLine("データを読み込みました");
}
このように書けば、呼び出し側でawaitできます。
C#await LoadDataAsync();
初心者のうちは、「イベントハンドラー以外ではasync Taskを使う」と覚えておくと安全です。
7-4. 非同期処理で初心者が注意すべきポイント
非同期処理では、通常のvoid以上に戻り値の型を意識する必要があります。
戻り値がない通常メソッドならvoid、非同期で完了を待ちたいならTask、非同期で値を返したいならTask<T>を使います。
C#async Task<string> GetMessageAsync()
{
await Task.Delay(1000);
return "完了しました";
}
呼び出し側では、次のように結果を受け取れます。
C#string message = await GetMessageAsync();
非同期処理で値を返したい場合、stringではなくTask<string>のように書く点に注意しましょう。
C#async Task<int> GetNumberAsync()
{
await Task.Delay(1000);
return 10;
}
async voidは便利に見えますが、使いすぎるとエラーの追跡が難しくなります。通常はasync Taskを選び、必要な場合だけasync voidを使うのが基本です。
8. voidに関するよくある質問
ここでは、C#のvoidについて初心者が疑問に感じやすいポイントをQ&A形式で解説します。
8-1. voidは変数の型として使える?
通常、voidは変数の型として使えません。
次のような書き方はできません。
C#void value;
voidは「値がない」ことを表すため、変数として値を保持できないからです。
変数には、値を入れるための型を指定します。
C#int number = 10;
string name = "田中";
bool isActive = true;
voidは主に、メソッドの戻り値がないことを示すために使います。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
8-2. voidメソッドは値を返せないのに何のために使う?
voidメソッドは、値を返すためではなく、処理を実行するために使います。
たとえば、画面に表示する、データを保存する、状態を変更する、ログを出力するなどの処理では、戻り値が不要な場合があります。
C#void PrintLog(string message)
{
Console.WriteLine("[LOG] " + message);
}
このメソッドは、ログを表示することが目的です。呼び出し元に値を返す必要はありません。
戻り値がなくても、処理を整理したり、同じ処理を再利用したり、コードを読みやすくしたりするためにvoidメソッドはよく使われます。
8-3. voidとnullの違いは?
voidとnullはまったく別のものです。
voidは、メソッドが値を返さないことを表すキーワードです。
C#void Show()
{
Console.WriteLine("表示します");
}
一方、nullは、参照型の変数などが「何も参照していない」状態を表す値です。
C#string name = null;
voidは型のようにメソッド定義で使われますが、nullは値として変数に代入できます。
つまり、voidは「戻り値が存在しない」、nullは「値として何も参照していない」という違いがあります。
次のように、voidメソッドがnullを返すことはできません。
C#void Test()
{
return null;
}
これはエラーになります。voidメソッドでは値を返せないためです。
8-4. voidを省略することはできる?
通常のメソッド定義では、voidを省略することはできません。
次のような書き方はエラーになります。
C#ShowMessage()
{
Console.WriteLine("こんにちは");
}
C#では、メソッドを定義するときに戻り値の型を書く必要があります。値を返さないなら、明示的にvoidを書きます。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
ただし、C#の新しい書き方では、トップレベルステートメントを使ってMainメソッドを明示的に書かないことがあります。
C#Console.WriteLine("Hello, World!");
この場合、見た目上はstatic void Main()を書いていません。しかし、通常のメソッド定義でvoidを省略できるわけではありません。
初心者のうちは、メソッドを作るときは「戻り値の型、メソッド名、丸括弧、波括弧」の形で書くと覚えておきましょう。
まとめ
C#のvoidは、メソッドが戻り値を返さないことを表すキーワードです。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
voidメソッドは、画面表示、データ保存、状態変更、ログ出力など、処理を実行することが目的の場面で使います。
一方、計算結果や文字列、判定結果などを呼び出し元で使いたい場合は、int、string、boolなどの戻り値ありメソッドを使います。
C#int Add(int a, int b)
{
return a + b;
}
voidメソッドでは、値を返すreturn 値;は使えません。ただし、処理を途中で終了するためのreturn;は使えます。
C#void Check(int number)
{
if (number < 0)
{
return;
}
Console.WriteLine(number);
}
また、voidメソッドの結果を変数に代入したり、Console.WriteLineの中で値として使ったりすることはできません。
voidにするか戻り値ありにするか迷ったときは、「呼び出し元で結果の値を使いたいか」を基準に考えましょう。処理だけ実行したいならvoid、値を使いたいなら戻り値ありのメソッドにするのが基本です。
async voidについては、通常の非同期処理ではできるだけ避け、基本的にはasync Taskを使うようにすると安全です。
voidを正しく理解すると、C#のメソッド設計がわかりやすくなり、エラーの原因も見つけやすくなります。初心者のうちは、まず「voidは何も返さないメソッド」と覚えて、戻り値ありのメソッドとの違いを意識しながらコードを書いていきましょう。

