C#のvoidとは?戻り値なしメソッドの意味・使い方・注意点を初心者向けに解説
はじめに
C#を学び始めると、かなり早い段階で目にするキーワードのひとつがvoidです。
たとえば、C#の入門コードでは次のような形がよく登場します。
C#static void Main()
{
Console.WriteLine("Hello, World!");
}
この中にあるvoidは、C#のメソッドを理解するうえでとても重要なキーワードです。
しかし初心者のうちは、「voidとは何か」「なぜ書く必要があるのか」「returnとはどう違うのか」「voidメソッドは何をしているのか」と迷いやすいポイントでもあります。
この記事では、C#のvoidについて、戻り値なしメソッドの意味、基本的な使い方、戻り値ありメソッドとの違い、注意点、よくあるエラーまで初心者向けにわかりやすく解説します。
1. C#のvoidとは?まずは意味を初心者向けに解説
C#のvoidは、メソッドの戻り値に関するキーワードです。
メソッドとは、ひとまとまりの処理に名前を付けたものです。C#では、メソッドを定義するときに「そのメソッドが何か値を返すのか」を書く必要があります。
そのとき、「このメソッドは値を返しません」と表すために使うのがvoidです。
1-1. voidは「戻り値がない」ことを表すキーワード
voidは、「戻り値がない」という意味を表します。
たとえば、次のメソッドを見てみましょう。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
このShowMessageメソッドは、画面に「こんにちは」と表示します。
しかし、このメソッドを実行した結果として、呼び出し元にintやstringなどの値を返すわけではありません。
そのため、戻り値の型としてvoidを指定しています。
C#void ShowMessage()
この部分は、「ShowMessageというメソッドは、戻り値を返さない」という意味です。
1-2. メソッドの戻り値とは何か
戻り値とは、メソッドの処理結果として呼び出し元に返す値のことです。
たとえば、次のメソッドは2つの数値を足して、その結果を返します。
C#int Add(int a, int b)
{
return a + b;
}
このメソッドはint型の値を返します。
C#int result = Add(3, 5);
Console.WriteLine(result);
実行すると、resultには8が入ります。
このように、メソッドを呼び出したあとで結果を変数に入れたり、別の処理で使ったりできる値が戻り値です。
一方、voidメソッドは戻り値を返さないため、次のように結果を変数に代入することはできません。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
C#// エラーになる
string message = ShowMessage();
ShowMessageは値を返さないため、string型の変数に代入できないのです。
1-3. voidを使う場面と使わない場面
voidは、処理を実行すること自体が目的の場合によく使います。
たとえば、次のような処理です。
C#void PrintName(string name)
{
Console.WriteLine(name);
}
このメソッドは、名前を画面に表示することが目的です。表示したあとに何か値を返す必要がないため、voidを使います。
一方、計算結果や判定結果をあとで使いたい場合は、voidではなく戻り値ありのメソッドにします。
C#int GetSquare(int number)
{
return number * number;
}
このメソッドは、計算結果を返すことが目的です。そのため、戻り値の型はvoidではなくintになります。
つまり、基本的には次のように考えるとわかりやすいです。
処理を実行するだけならvoid、処理結果をあとで使うなら戻り値ありのメソッドです。
1-4. 「何も処理しない」という意味ではない点に注意
voidは「何もしない」という意味ではありません。
voidはあくまで「戻り値がない」という意味です。
たとえば、次のメソッドはvoidですが、しっかり処理を行っています。
C#void SaveLog(string message)
{
Console.WriteLine("ログ: " + message);
}
このメソッドは値を返しませんが、ログを表示するという処理を実行しています。
そのため、voidを見たときは「このメソッドは何もしていない」と考えるのではなく、「このメソッドは呼び出し元に値を返さない」と理解しましょう。
2. C#のvoidメソッドの基本的な書き方
C#でvoidメソッドを書くときは、メソッド名の前にvoidを指定します。
ここでは、基本的な構文から簡単なサンプルまで見ていきましょう。
2-1. voidメソッドの構文
voidメソッドの基本形は次のとおりです。
C#void メソッド名()
{
実行する処理;
}
たとえば、メッセージを表示するメソッドなら次のように書けます。
C#void ShowMessage()
{
Console.WriteLine("メッセージを表示します");
}
このメソッドを呼び出すには、次のようにメソッド名を書きます。
C#ShowMessage();
voidメソッドは値を返さないため、基本的には「呼び出して実行する」だけです。
2-2. Console.WriteLineを使った簡単なサンプル
C#のvoidを理解するには、Console.WriteLineを使った例がわかりやすいです。
C#using System;
class Program
{
static void Main()
{
ShowGreeting();
}
static void ShowGreeting()
{
Console.WriteLine("おはようございます");
}
}
このコードでは、Mainメソッドの中でShowGreetingメソッドを呼び出しています。
C#ShowGreeting();
ShowGreetingメソッドは、画面に文字を表示します。
C#static void ShowGreeting()
{
Console.WriteLine("おはようございます");
}
戻り値を返す必要がないため、戻り値の型としてvoidを指定しています。
2-3. 引数ありのvoidメソッドの例
voidメソッドは、引数を受け取ることもできます。
引数とは、メソッドに渡す値のことです。
C#using System;
class Program
{
static void Main()
{
PrintUserName("田中");
PrintUserName("佐藤");
}
static void PrintUserName(string name)
{
Console.WriteLine("ユーザー名: " + name);
}
}
この例では、PrintUserNameメソッドがstring型のnameを受け取っています。
C#static void PrintUserName(string name)
ただし、戻り値は返さないためvoidです。
実行すると、次のように表示されます。
ユーザー名: 田中
ユーザー名: 佐藤
このように、voidメソッドでも引数を使って値を受け取り、その値をもとに処理を行うことができます。
2-4. static void Mainの意味
C#の入門でよく見るstatic void Mainも、voidの使い方のひとつです。
C#static void Main()
{
Console.WriteLine("Hello, World!");
}
このMainメソッドは、C#プログラムの実行開始地点です。
static void Mainの意味を分解すると、次のようになります。
staticは、インスタンスを作らずに呼び出せることを表します。
voidは、戻り値を返さないことを表します。
Mainは、プログラムの開始地点となるメソッド名です。
つまり、static void Main()は「プログラム開始時に実行される、戻り値なしのメソッド」と考えるとわかりやすいです。
なお、C#ではMainメソッドがintを返す形で書かれることもあります。
C#static int Main()
{
return 0;
}
ただし、初心者向けの基本としては、まずstatic void Main()を理解しておくとよいでしょう。
3. voidと戻り値ありメソッドの違い
voidメソッドと戻り値ありメソッドの違いは、処理結果を呼び出し元に返すかどうかです。
この違いを理解すると、どちらを使うべきか判断しやすくなります。
3-1. int・string・boolなどを返すメソッドとの比較
戻り値ありメソッドでは、voidの代わりにint、string、boolなどの型を書きます。
たとえば、intを返すメソッドは次のように書きます。
C#int GetAge()
{
return 20;
}
stringを返すメソッドは次のように書きます。
C#string GetName()
{
return "山田";
}
boolを返すメソッドは次のように書きます。
C#bool IsAdult(int age)
{
return age >= 20;
}
一方、voidメソッドは値を返しません。
C#void ShowAge()
{
Console.WriteLine(20);
}
GetAgeは年齢を値として返しますが、ShowAgeは年齢を画面に表示するだけです。
この違いが、voidと戻り値ありメソッドの大きな違いです。
3-2. returnで値を返す場合と返さない場合
戻り値ありメソッドでは、returnを使って値を返します。
C#int Add(int a, int b)
{
return a + b;
}
この場合、戻り値の型はintなので、returnでint型の値を返す必要があります。
C#int result = Add(10, 20);
一方、voidメソッドでは値を返しません。
C#void PrintResult(int value)
{
Console.WriteLine("結果: " + value);
}
このメソッドは画面に表示するだけなので、return 値;を書く必要はありません。
3-3. voidメソッドでreturnを使うケース
voidメソッドでは値を返すことはできませんが、return;だけを書くことはできます。
C#void CheckNumber(int number)
{
if (number < 0)
{
Console.WriteLine("負の数です");
return;
}
Console.WriteLine("0以上の数です");
}
この例では、numberが負の数だった場合、メッセージを表示してメソッドの処理をそこで終了しています。
C#return;
voidメソッドで使うreturn;は、値を返すためではなく、メソッドの処理を途中で終わらせるために使います。
次のように値を返そうとするとエラーになります。
C#void Sample()
{
return 10; // エラー
}
voidメソッドでは、returnのあとに値を書けません。
3-4. どちらを使うべきか判断する基準
voidを使うか、戻り値ありメソッドにするかは、メソッドの目的で判断します。
たとえば、計算結果をあとで使いたいなら戻り値ありにします。
C#int CalculateTotal(int price, int count)
{
return price * count;
}
このメソッドなら、結果を変数に入れて別の処理に使えます。
C#int total = CalculateTotal(100, 3);
Console.WriteLine(total);
一方、画面に表示するだけならvoidで十分です。
C#void ShowTotal(int total)
{
Console.WriteLine("合計金額: " + total);
}
判断に迷ったときは、「このメソッドの結果をあとで使いたいか」を考えるとよいでしょう。
結果をあとで使うなら戻り値あり、実行するだけでよいならvoidです。
4. voidメソッドの具体的な使い方
voidメソッドは、C#のさまざまな場面で使われます。
特に、画面表示、状態変更、ファイル保存、ログ出力、イベント処理などではvoidがよく登場します。
4-1. 画面に文字を表示する処理
画面に文字を表示する処理は、voidメソッドの代表的な使い方です。
C#void ShowWelcomeMessage()
{
Console.WriteLine("ようこそ");
}
このメソッドは、画面に「ようこそ」と表示するだけです。
戻り値を返す必要がないため、voidを使います。
引数を使えば、表示内容を変えることもできます。
C#void ShowMessage(string message)
{
Console.WriteLine(message);
}
呼び出し例は次のとおりです。
C#ShowMessage("処理を開始します");
ShowMessage("処理が完了しました");
このように、表示処理は「結果を返す」よりも「実行する」ことが目的なので、voidに向いています。
4-2. 変数やオブジェクトの状態を変更する処理
voidメソッドは、オブジェクトの状態を変更する処理にも使われます。
たとえば、ユーザーの名前を変更する処理を考えてみましょう。
C#class User
{
public string Name;
public void ChangeName(string newName)
{
Name = newName;
}
}
このChangeNameメソッドは、UserオブジェクトのNameを変更します。
C#User user = new User();
user.Name = "田中";
user.ChangeName("佐藤");
Console.WriteLine(user.Name);
実行すると、Nameは「佐藤」に変わります。
ChangeNameメソッドは値を返していませんが、オブジェクトの状態を変更しています。
このように、戻り値がなくても、メソッドの中で何らかの変更を行うことがあります。
4-3. ファイル保存・ログ出力など副作用が目的の処理
ファイル保存やログ出力のように、プログラムの外部に影響を与える処理でもvoidが使われます。
このような処理は、副作用が目的の処理と呼ばれることがあります。
たとえば、ログ出力の例です。
C#void WriteLog(string message)
{
Console.WriteLine("[LOG] " + message);
}
実際のアプリケーションでは、ファイルにログを書き込むこともあります。
C#using System.IO;
void SaveText(string path, string text)
{
File.WriteAllText(path, text);
}
このメソッドは、指定されたファイルに文字列を保存します。
戻り値を返していませんが、ファイルが作成または更新されるという処理を行っています。
このように、外部への出力や状態変更が目的の場合、voidメソッドが使われることがあります。
4-4. イベント処理で使われるvoid
C#では、ボタンがクリックされたときなどのイベント処理でもvoidがよく使われます。
たとえば、Windows FormsやWPFなどでは、イベントハンドラーが次のような形になることがあります。
C#void Button_Click(object sender, EventArgs e)
{
Console.WriteLine("ボタンがクリックされました");
}
イベント処理は、ユーザーの操作に反応して処理を実行することが目的です。
多くの場合、呼び出し元に値を返す必要はありません。
そのため、イベントハンドラーではvoidがよく使われます。
ただし、非同期処理を使う場合のasync voidには注意が必要です。これについては後半で解説します。
5. voidを使うときの注意点
voidは便利ですが、何でもvoidにすればよいわけではありません。
戻り値がないという性質を理解していないと、コードが使いにくくなったり、エラーの原因になったりします。
5-1. voidメソッドの結果は変数に代入できない
voidメソッドは戻り値を返さないため、結果を変数に代入できません。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
このメソッドを次のように使うことはできません。
C#string result = ShowMessage(); // エラー
ShowMessageはstringを返していないためです。
もし結果を変数に入れたいなら、戻り値ありのメソッドにする必要があります。
C#string GetMessage()
{
return "こんにちは";
}
この場合は、次のように代入できます。
C#string result = GetMessage();
Console.WriteLine(result);
5-2. voidメソッドは計算結果の再利用に向かない
voidメソッドは、計算結果を再利用したい場合には向いていません。
たとえば、次のようなメソッドを考えてみましょう。
C#void PrintTotal(int price, int count)
{
Console.WriteLine(price * count);
}
このメソッドは合計金額を表示しますが、計算結果を呼び出し元に返していません。
そのため、合計金額をあとで割引計算や税込計算に使うことができません。
再利用したい場合は、戻り値ありにしたほうが便利です。
C#int CalculateTotal(int price, int count)
{
return price * count;
}
このようにすれば、計算結果を変数に入れて使えます。
C#int total = CalculateTotal(100, 3);
int discounted = total - 50;
Console.WriteLine(discounted);
計算結果を別の処理でも使いたい場合は、voidではなく戻り値ありメソッドを選びましょう。
5-3. 処理内容が分かるメソッド名にする
voidメソッドは戻り値がないため、メソッド名から「何をするのか」がわかることが大切です。
たとえば、次のような名前は少し曖昧です。
C#void Data()
{
// 何をするのか分かりにくい
}
この名前だけでは、データを取得するのか、表示するのか、保存するのかわかりません。
voidメソッドでは、処理を表す動詞を使った名前にするとわかりやすくなります。
C#void SaveData()
{
// データを保存する
}
void PrintData()
{
// データを表示する
}
void ClearData()
{
// データを消去する
}
Save、Print、Clear、Show、Update、Deleteなど、処理内容が伝わる名前にすると、コードの読みやすさが上がります。
5-4. 何でもvoidにするとテストや保守が難しくなる
初心者のうちは、すべての処理をvoidメソッドにしてしまいがちです。
しかし、何でもvoidにすると、テストや保守が難しくなることがあります。
たとえば、次のメソッドは計算結果を表示するだけです。
C#void PrintTaxIncludedPrice(int price)
{
int result = (int)(price * 1.1);
Console.WriteLine(result);
}
このメソッドは、画面表示まで含んでいるため、計算結果だけを確認したい場合に使いにくくなります。
計算と表示を分けると、より扱いやすくなります。
C#int CalculateTaxIncludedPrice(int price)
{
return (int)(price * 1.1);
}
void PrintPrice(int price)
{
Console.WriteLine(price);
}
このようにすると、計算結果をテストしやすくなります。
C#int price = CalculateTaxIncludedPrice(1000);
PrintPrice(price);
voidは便利ですが、処理結果を確認したい場合や再利用したい場合は、戻り値ありメソッドにすることも検討しましょう。
6. 初心者が間違えやすいvoidのエラー例
C#のvoidは基本的なキーワードですが、初心者がつまずきやすいエラーもあります。
ここでは、よくある間違いを具体例で見ていきます。
6-1. voidメソッドの戻り値を受け取ろうとする
よくある間違いのひとつが、voidメソッドの結果を変数に代入しようとすることです。
C#void PrintHello()
{
Console.WriteLine("Hello");
}
このメソッドに対して、次のように書くとエラーになります。
C#string result = PrintHello(); // エラー
PrintHelloは戻り値を返さないため、resultに入れる値がありません。
正しくは、次のように呼び出すだけです。
C#PrintHello();
もし文字列を受け取りたいなら、メソッドをstring型で返すようにします。
C#string GetHello()
{
return "Hello";
}
C#string result = GetHello();
Console.WriteLine(result);
6-2. voidメソッドで値をreturnしようとする
voidメソッドでは、returnで値を返すことはできません。
C#void GetNumber()
{
return 10; // エラー
}
voidは戻り値なしを表すため、return 10;のように値を返す書き方はできません。
値を返したい場合は、戻り値の型を変更します。
C#int GetNumber()
{
return 10;
}
一方、voidメソッド内で処理を途中終了したいだけなら、次のようにreturn;と書きます。
C#void CheckValue(int value)
{
if (value < 0)
{
return;
}
Console.WriteLine(value);
}
voidメソッドで使えるのは、値なしのreturn;です。
6-3. 戻り値ありメソッドでreturnを書き忘れる
voidではないメソッドでは、基本的に値を返す必要があります。
たとえば、次のコードはエラーになります。
C#int Add(int a, int b)
{
int result = a + b;
// returnを書き忘れている
}
このメソッドはintを返すと宣言しているため、returnでint型の値を返さなければなりません。
正しくは次のように書きます。
C#int Add(int a, int b)
{
int result = a + b;
return result;
}
または、次のように直接返すこともできます。
C#int Add(int a, int b)
{
return a + b;
}
戻り値ありメソッドでは、宣言した型に合う値をreturnする必要があります。
6-4. voidとnullを混同する
voidとnullを混同するのも、初心者によくある間違いです。
voidは「戻り値がない」という意味です。
一方、nullは「参照先がない」「値が存在しない状態」を表します。
たとえば、次のようにstring型の変数にnullを入れることがあります。
C#string name = null;
これは、nameがどの文字列も参照していない状態です。
しかし、voidは値ではないため、変数に入れるものではありません。
C#// このような使い方はできない
// void value;
また、voidメソッドはnullを返しているわけでもありません。
C#void Show()
{
Console.WriteLine("表示します");
}
このメソッドは、nullを返しているのではなく、そもそも戻り値を返していません。
voidは戻り値の有無に関するキーワード、nullは値の状態を表すもの、と分けて理解しましょう。
7. voidと関連して覚えたいC#の重要キーワード
voidを正しく理解するには、関連するC#のキーワードも一緒に覚えると効果的です。
特に、return、static、Main、asyncはvoidと一緒に登場することが多いです。
7-1. returnとの関係
returnは、メソッドの処理を終了したり、戻り値を返したりするために使うキーワードです。
戻り値ありメソッドでは、returnで値を返します。
C#int GetScore()
{
return 100;
}
この場合、return 100;によってint型の値を返しています。
一方、voidメソッドでは値を返せません。
C#void ShowScore()
{
Console.WriteLine(100);
}
ただし、voidメソッドでも処理を途中で終了するためにreturn;を使えます。
C#void ShowScore(int score)
{
if (score < 0)
{
Console.WriteLine("不正な点数です");
return;
}
Console.WriteLine(score);
}
このように、returnは戻り値ありメソッドでは「値を返す」、voidメソッドでは「処理を終了する」という使い方になります。
7-2. staticとの関係
staticは、クラスから直接呼び出せるメンバーを表すキーワードです。
static voidという形は、C#の入門コードでよく出てきます。
C#static void Main()
{
Console.WriteLine("Hello");
}
ここでのstaticとvoidは、それぞれ別の意味を持っています。
staticは、インスタンスを作らずに使えることを表します。
voidは、戻り値がないことを表します。
たとえば、次のようなメソッドも書けます。
C#static void ShowMessage()
{
Console.WriteLine("メッセージ");
}
これは、「インスタンスを作らずに呼び出せる、戻り値なしのメソッド」です。
staticとvoidはセットで覚えがちですが、意味はまったく別です。
7-3. Mainメソッドとの関係
Mainメソッドは、C#プログラムの実行開始地点です。
C#static void Main()
{
Console.WriteLine("プログラム開始");
}
このMainメソッドが実行されることで、プログラムが始まります。
初心者向けのサンプルでは、static void Main()という形がよく使われます。
ただし、Mainメソッドは必ずvoidでなければならないわけではありません。
次のように、intを返す形もあります。
C#static int Main()
{
return 0;
}
また、非同期処理を使う場合は次のような形もあります。
C#static async Task Main()
{
await Task.Delay(1000);
}
最初はstatic void Main()を基本形として覚え、慣れてきたら他の形も学ぶとよいでしょう。
7-4. async voidとasync Taskの違い
C#では、非同期処理を書くときにasyncを使います。
そのとき、async voidという書き方を見ることがあります。
C#async void Button_Click(object sender, EventArgs e)
{
await Task.Delay(1000);
Console.WriteLine("完了");
}
async voidは、主にイベントハンドラーで使われます。
ただし、通常の非同期メソッドでは、async voidよりもasync Taskを使うのが一般的です。
C#async Task LoadDataAsync()
{
await Task.Delay(1000);
Console.WriteLine("データ読み込み完了");
}
async Taskにすると、呼び出し元が処理の完了を待ったり、例外を扱ったりしやすくなります。
C#await LoadDataAsync();
一方、async voidは呼び出し元が完了を待ちにくく、例外処理も難しくなる場合があります。
そのため、イベントハンドラーなど特別な場面を除いて、非同期メソッドではasync Taskを使うのが基本です。
8. voidを使うべきか迷ったときの判断ポイント
C#でメソッドを書くときに、voidにするか戻り値ありにするか迷うことがあります。
その場合は、メソッドの目的と、処理結果をあとで使うかどうかを考えると判断しやすくなります。
8-1. 処理結果を後で使うなら戻り値ありにする
メソッドの処理結果をあとで使いたい場合は、戻り値ありメソッドにします。
たとえば、合計金額を計算する処理です。
C#int CalculateTotal(int price, int count)
{
return price * count;
}
このように戻り値を返せば、結果を変数に代入できます。
C#int total = CalculateTotal(500, 4);
Console.WriteLine(total);
さらに、計算結果を別の処理に使えます。
C#int total = CalculateTotal(500, 4);
int taxIncluded = (int)(total * 1.1);
このように、結果を再利用する可能性があるなら、voidではなく戻り値ありにするのがおすすめです。
8-2. 処理を実行するだけならvoidを使う
処理を実行すること自体が目的なら、voidを使います。
たとえば、メッセージを表示する処理です。
C#void ShowErrorMessage()
{
Console.WriteLine("エラーが発生しました");
}
このメソッドは、エラーメッセージを表示することが目的です。
表示した結果を呼び出し元で使う必要がないため、voidで問題ありません。
ログ出力やファイル保存なども、処理を実行することが目的ならvoidが使われることがあります。
C#void WriteLog(string message)
{
Console.WriteLine("[LOG] " + message);
}
8-3. 副作用の有無で考える
voidメソッドは、副作用がある処理で使われることが多いです。
副作用とは、メソッドの外側に何らかの影響を与えることです。
たとえば、次のような処理です。
C#void UpdateName(User user, string newName)
{
user.Name = newName;
}
このメソッドは戻り値を返しませんが、userオブジェクトの状態を変更しています。
また、次のような処理も副作用があります。
C#void PrintLog(string message)
{
Console.WriteLine(message);
}
画面に表示することも、プログラムの外側に影響を与える処理です。
副作用がある処理ではvoidが使われやすいですが、何でもvoidにすると処理結果が追いにくくなることがあります。
「このメソッドは何を変更するのか」「戻り値で返したほうがわかりやすくないか」を考えることが大切です。
8-4. 初心者向けの使い分け早見表
voidを使うべきか迷ったときは、次のように考えると判断しやすくなります。
| やりたいこと | おすすめ | 例 |
|---|---|---|
| 画面に文字を表示する | void | ShowMessage() |
| ログを出力する | void | WriteLog() |
| オブジェクトの状態を変更する | voidまたは戻り値あり | UpdateUser() |
| 数値を計算して使う | 戻り値あり | CalculateTotal() |
| 文字列を作って使う | 戻り値あり | CreateMessage() |
| true/falseで判定する | 戻り値あり | IsAdult() |
| ファイルに保存する | voidまたは成功可否を返す | SaveFile() |
| 非同期処理を行う | 基本はTask | LoadDataAsync() |
初心者のうちは、「結果を使うなら戻り値あり」「実行するだけならvoid」と覚えるとよいでしょう。
ただし、実務ではエラー処理やテストのしやすさも考えて、戻り値を返す設計にすることがあります。
9. C#のvoidに関するよくある質問
最後に、C#のvoidについて初心者が疑問に感じやすい点をQ&A形式で解説します。
9-1. voidは型なのか
C#のvoidは、メソッドが値を返さないことを表すキーワードです。
intやstringのように変数を作って値を入れるための型とは扱いが異なります。
たとえば、次のようにvoid型の変数を作ることはできません。
C#// エラー
// void value;
メソッドの戻り値の位置で使われる特別なキーワードとして理解するとよいでしょう。
C#void ShowMessage()
{
Console.WriteLine("Hello");
}
この場合、ShowMessageは戻り値を返さないメソッドです。
9-2. voidメソッドはreturnを書かなくてもよいのか
はい、voidメソッドでは通常、returnを書かなくても問題ありません。
C#void ShowMessage()
{
Console.WriteLine("こんにちは");
}
このメソッドは、最後まで処理が進むと自動的に終了します。
ただし、途中で処理を終わらせたい場合はreturn;を書くことがあります。
C#void PrintName(string name)
{
if (name == null)
{
return;
}
Console.WriteLine(name);
}
この場合、nameがnullならそこで処理を終了します。
voidメソッドでは、値を返すreturn 値;は使えませんが、処理を終わらせるreturn;は使えます。
9-3. voidとnullの違いは何か
voidとnullはまったく別のものです。
voidは、メソッドが戻り値を返さないことを表します。
C#void Show()
{
Console.WriteLine("表示");
}
一方、nullは、参照型の変数などが何も参照していない状態を表します。
C#string name = null;
voidはメソッドの戻り値に関するキーワードで、nullは値の状態を表すものです。
また、voidメソッドはnullを返しているわけではありません。そもそも何も返していない、という点が重要です。
9-4. voidメソッドは値をまったく扱えないのか
いいえ、voidメソッドでも値を扱うことはできます。
voidは「値を返さない」という意味であり、「値を使えない」という意味ではありません。
たとえば、次のように引数で値を受け取れます。
C#void PrintMessage(string message)
{
Console.WriteLine(message);
}
呼び出し側では、文字列を渡せます。
C#PrintMessage("こんにちは");
また、メソッドの中で変数を使うこともできます。
C#void ShowTotal(int price, int count)
{
int total = price * count;
Console.WriteLine(total);
}
このように、voidメソッドでも引数や変数を扱えます。
ただし、処理結果を呼び出し元に返すことはできません。
9-5. async voidはなぜ注意が必要なのか
async voidは、非同期処理で使える書き方ですが、通常のメソッドでは注意が必要です。
C#async void LoadData()
{
await Task.Delay(1000);
Console.WriteLine("完了");
}
async voidは戻り値がないため、呼び出し元が処理の完了を待ちにくくなります。
また、例外が発生したときの扱いも難しくなることがあります。
そのため、イベントハンドラーを除いて、非同期メソッドでは基本的にasync Taskを使います。
C#async Task LoadDataAsync()
{
await Task.Delay(1000);
Console.WriteLine("完了");
}
この形なら、呼び出し元でawaitできます。
C#await LoadDataAsync();
初心者のうちは、「非同期メソッドは基本的にasync Task、イベント処理ではasync voidが使われることがある」と覚えておくとよいでしょう。
まとめ
C#のvoidは、メソッドが戻り値を返さないことを表すキーワードです。
voidメソッドは、画面に文字を表示する、ログを出力する、ファイルに保存する、オブジェクトの状態を変更する、イベント処理を行うといった場面でよく使われます。
一方で、計算結果や判定結果をあとで使いたい場合は、voidではなくint、string、boolなどの戻り値ありメソッドにする必要があります。
特に初心者が注意したいのは、voidメソッドの結果は変数に代入できないこと、voidメソッドでreturn 値;は書けないこと、voidとnullは別物であることです。
判断に迷ったときは、次のように考えるとわかりやすいです。
処理を実行するだけならvoidを使います。
処理結果をあとで使うなら戻り値ありメソッドにします。
C#のvoidは基本的なキーワードですが、メソッド設計の考え方にもつながる重要な要素です。まずは「戻り値がない」という意味をしっかり理解し、処理の目的に合わせてvoidと戻り値ありメソッドを使い分けられるようになりましょう。

