演習 - メソッドの戻り値と入力パラメーター
前のユニットでは、"ロール ダイス" コーディング シナリオを使用して、ステートフル (インスタンス) メソッドとステートレス (静的) メソッドの違いを示しました。 その同じシナリオは、メソッドの呼び出しに関する他の重要な概念を理解するのに役立ちます。 次に例を示します。
- メソッドの戻り値を処理する。
- メソッドに入力パラメーターを渡す。
- オーバーロードされたバージョンのメソッドを選択する。
戻り値
一部のメソッドは、関数を完了し、"静かに" 終了するように設計されています。 つまり、終了時に値は返されません。 これらは void メソッドと呼ばれます。
その他のメソッドは、完了時に値を返すように設計されています。 戻り値は通常、操作の結果です。 戻り値とは、メソッドで、そのメソッドを呼び出すコードと通信する主な方法です。
ランダムに生成された数値の値を含む int
型が Random.Next()
メソッドから返されるのを確認しました。 ただし、メソッドは、任意のデータ型 (場合によっては別のクラス) を返すように設計できます。 たとえば、String
クラスには文字列を返すメソッド、整数を返すメソッド、ブール値を返すメソッドがあります。
値を返すメソッドを呼び出すときは、多くの場合、戻り値を変数に割り当てます。 そうすることで、後で値をコードで使用できます。 サイコロのシナリオでは、Random.Next()
の戻り値を roll
変数に割り当てます。
int roll = dice.Next(1, 7);
場合によっては、戻り値を変数に割り当てずに直接使うこともできます。 たとえば、戻り値を次のようにコンソールに出力することもできます。
Console.WriteLine(dice.Next(1, 7));
メソッドによって値が返されますが、戻り値を使用せずにメソッドを呼び出すこともできます。 たとえば、メソッドを次のように呼び出すことで、戻り値を無視できます。
dice.Next(1, 7);
ただし、戻り値を無視しても意味がありません。 Next()
メソッドを呼び出す理由は、次のランダム値を取得できるようにするためです。
入力パラメーター
メソッドによって使用される情報は、パラメーターと呼ばれます。 メソッドでは、1 つ以上のパラメーターを使用してそのタスクを実行するか、またはまったく使用しません。
Note
用語 "パラメーター" と "引数" は、しばしば同じ意味で使用されます。 ただし、"パラメーター" は、メソッド内で使用されている変数を参照します。 "引数" は、メソッドが呼び出されるときに渡される値です。
ほとんどのメソッドは、1 つまたは複数の入力パラメーターを受け入れるように設計されています。 入力パラメーターは、メソッドでその作業の実行方法を構成するために使用したり、直接操作する場合もあります。 たとえば、Random.Next()
メソッドは入力パラメーターを使用して、戻り値の上限と下限を構成します。 ただし、Console.WriteLine()
では、値をコンソールに出力することによって、入力パラメーターを直接使用します。
メソッドでは、メソッド シグネチャを使って、メソッドが受け入れる入力パラメーターの数と各パラメーターのデータ型を定義します。 メソッドを呼び出すコーディング ステートメントは、メソッド シグネチャで指定された要件に従う必要があります。 一部のメソッドには、メソッドが受け入れるパラメーターの数と型のオプションが用意されています。
呼び出し元からメソッドを呼び出すとき、各パラメーターに引数と呼ばれる具体的な値を指定します。 引数はパラメーターの型と互換性がある必要があります。 ただし、引数名は、(それが呼び出し元のコードで使われている場合) メソッドで定義されているパラメーター名と同じである必要はありません。
次のコードがあるとします。
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
最初のコード行は、Random
クラスのインスタンスを dice
という名前で作成します。 2 番目のコード行では、dice.Next(1, 7)
メソッドを使って、roll
という名前の整数にランダムな値を割り当てます。 呼び出しステートメントでは、,
記号で区切られた 2 つの引数が指定されていることに注意してください。 Next()
メソッドには、int
型の 2 つの入力パラメーターを受け入れるメソッド シグネチャが含まれています。 これらのパラメーターは、返されるランダムな値の下限と上限を構成するために使われています。 最後のコード行では、Console.WriteLine()
メソッドを使って、roll
の値をコンソールに出力します。
メソッドに渡される引数は、メソッドによって定義された対応する入力パラメーターと同じデータ型である必要があります。 誤った型の引数をメソッドに渡そうとすると、C# コンパイラがその間違いを検出し、コードのコンパイルおよび実行の前に呼び出しステートメントを更新するよう強制されます。 型チェックは、実行時にエンド ユーザーがエラーを発生させないようにするために C# と .NET で使われる 1 つの方法です。
Note
多くの場合、入力パラメーターが使用されますが、すべてのメソッドでタスクを完了するために入力パラメーターが必要なわけではありません。 たとえば、Console
クラスには、入力パラメーターを使用しない Console.Clear()
メソッドが含まれています。 このメソッドはコンソールに表示される情報をクリアするために使用されるため、そのタスクを完了するために入力パラメーターは必要ありません。
オーバー ロードされたメソッド
.NET クラス ライブラリの多くのメソッドには、オーバーロードされた メソッド シグネチャがあります。 これにより、呼び出しステートメントで指定された引数の有無に関わらず、メソッドを呼び出すことができます。
オーバーロードされたメソッドは、複数のメソッド シグネチャで定義されています。 オーバーロードされたメソッドでは、メソッドを呼び出すさまざまな方法が提供されたり、さまざまな型のデータが提供されたりします。
場合によっては、さまざまなデータ型を使って入力パラメーターを定義するために、メソッドのオーバーロードされたバージョンが使われます。 たとえば、Console.WriteLine()
メソッドには、19 個の異なるオーバーロードされたバージョンがあります。 これらのオーバーロードのほとんどによって、メソッドが異なる型を受け入れ、指定された情報をコンソールに書き込むことができるようになります。 次のコードについて考えてみます。
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
この例では、3 つの別個のオーバーロードされたバージョンの WriteLine()
メソッドを呼び出します。
- 最初の
WriteLine()
メソッドでは、int
パラメーターを定義するメソッド シグネチャが使われています。 - 2 番目の
WriteLine()
メソッドでは、入力パラメーターを定義しないメソッド シグネチャが使われています。 - 3 番目の
WriteLine()
メソッドでは、string
パラメーターを定義するメソッド シグネチャが使われています。
また、オーバーロードされたバージョンのメソッドが異なる数の入力パラメーターを定義する場合もあります。 代替入力パラメーターを使用して、目的の結果をより詳細に制御できます。 たとえば、Random.Next()
メソッドには、ランダムに生成された数値にさまざまなレベルの制約を設定できるオーバーロードされたバージョンがあります。
次の演習では、Random.Next()
メソッドを呼び出して、さまざまなレベルの制約を持つランダムな整数値を生成します。
Visual Studio Code で空の Program.cs ファイルが開かれていることを確認します。
必要であれば、Visual Studio Code を開き、次の手順のようにしてエディターで Program.cs ファイルを準備します。
[ファイル] メニューの [フォルダーを開く] を選択します。
[フォルダーを開く] ダイアログを使って CsharpProjects フォルダーに移動して開きます。
Visual Studio Code のエクスプローラー パネルで、Program.cs を選びます。
Visual Studio Code の [選択] メニューで、[すべて選択] を選択してから Delete キーを押します。
Random.Next()
メソッドのオーバーロードされたバージョンを調べるには、次のコードを入力します。Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");
Visual Studio Code [ファイル] メニューの [保存] をクリックします。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。
コマンド プロンプトに表示されるフォルダー パスが、Program.cs ファイルを含むフォルダーを指していることを確認します。
コードを実行するには、ターミナルのコマンド プロンプトで、「dotnet run」と入力し、Enter キーを押します。
結果は次の出力のようになります。
First roll: 342585470 Second roll: 43 Third roll: 89
生成される数値はランダムであるため、実際の結果は異なります。 ただし、この例では、生じる可能性がある結果の範囲を示します。
時間を取ってコードを確認してください。
Next()
メソッドの最初のバージョンでは、上限と下限が設定されないため、メソッドで0
から2,147,483,647
(int
で格納できる最大値) までの範囲の値が返されます。Next()
メソッドの 2 番目のバージョンでは、最大値を上限として指定します。したがって、この場合は、0
と100
の間のランダム値が予想されます。Next()
メソッドの 3 番目のバージョンでは、最小値と最大値の両方を指定します。したがって、この場合は、50
と100
の間のランダム値が予想されます。[ターミナル] パネルを閉じます。
このユニットでは、いくつかのトピックを既に確認しました。 説明した内容の簡単な一覧を次に示します。
- メソッドの戻り値を使用する方法を確認しました (メソッドによって戻り値が提供される場合)。
- メソッドで特定のデータ型として定義されている入力パラメーターを使用する方法を確認しました。
- さまざまな入力パラメーターまたはパラメーター型を含む一部のメソッドのオーバーロードされたバージョンを確認しました。
IntelliSense を使用する
Visual Studio Code には、言語サービスを利用する IntelliSense 機能が含まれています。 たとえば、C# 言語サービスは、言語セマンティクスとソース コードの分析に基づいてインテリジェントなコード補完を提供します。 このセクションでは、IntelliSense を使用して Random.Next()
メソッドを実装します。
IntelliSense はコード エディター内で公開されるため、コーディング環境を離れることなくメソッドについて多くのことを学ぶことができます。 IntelliSense では、自分のコードを入力すると、カーソルの場所の下のポップアップ ウィンドウにヒントと参照情報が表示されます。 コードの入力時に、IntelliSense のポップアップ ウィンドウで、コンテキストに応じて、その内容が変更されます。
たとえば、dice
という単語をゆっくり入力すると、IntelliSense によって、すべての C# キーワード、識別子 (というよりはむしろ、コード内の変数名)、および入力されている文字と一致する .NET クラス ライブラリのクラスが表示されます。 コード エディターのオートコンプリート機能を使用して、IntelliSense のポップアップの先頭にある一致した単語の入力を完了することができます。 試してみましょう。
Program.cs ファイルが Visual Studio Code で開かれていることを確認します。
お使いのアプリには、次のコードが含まれている必要があります。
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");
コード ファイルの下部で IntelliSense を試すには、ゆっくりと文字
d
、i
を入力し、次にc
を入力します。入力を開始すると表示される IntelliSense ポップアップ ウィンドウに注目してください。
IntelliSense がポップアップ表示されると、候補の一覧が表示されます。
dic
を入力すると、識別子dice
が一覧の先頭に表示されます。キーボードの Tab キーを押します。
エディターで単語
dice
全体が入力されていることに注意してください。 Tab キーを押す前に、上下の方向キーを使用して選択内容を変更できます。Note
IntelliSense ウィンドウが表示されなくなった場合は、キーボードの
backspace
キーを使用して最後の記号を再入力することで、IntelliSense を再度開くことができます。メンバー アクセス演算子を指定するには、
.
文字を入力します。.
を入力すると IntelliSense ポップアップが再び表示され、使用可能なすべてのメソッド (およびクラスの他のメンバー) のフィルター処理されていない一覧が表示されます。「N」を入力します。
リストがフィルター処理され、単語
Next
が一番上の選択項目になるはずです。単語全体をオートコンプリートするには、Tab キーを押します。
メソッド呼び出し演算子を指定するには、「(」と入力します。
終わりかっこが自動的に追加されることに注意してください。
メソッド呼び出し演算子とは、メソッド名の右側にあるかっこのセットです。 呼び出しステートメントのこの部分では、メソッドに渡される引数を指定します。 メソッド呼び出し演算子は、メソッドを呼び出すときに必要です。
IntelliSense ポップアップに
Random.Next()
メソッドに関する詳細情報が表示されます。少し時間を取って、
Random.Next()
メソッドの IntelliSense ポップアップを調べます。Note
IntelliSense ポップアップが、調べる前に閉じた場合は、呼び出し演算子
()
を削除してから、「(」を入力して IntelliSense ポップアップを表示します。ポップアップ ウィンドウには 3 つのセクション (左側に 1 つ、右側に 2 つ) が含まれていることに注意してください。
右側には、上部のセクションに
int Random.Next(int minValue, int maxValue)
が、下部のセクションにReturns a non-negative random integer.
が表示されます。int
は、メソッドの戻り値の型を定義します。 つまり、このバージョンのメソッドを実行すると、int
という型の値が返されます。IntelliSense ポップアップの左側に
1/3
が表示されます。1/3
は、Next()
メソッドの 3 つのメソッド シグネチャの 1 つ目を確認していることを示します。 このバージョンのメソッド シグネチャでは、入力パラメーターなし (呼び出しステートメントでメソッドに引数が渡されない) でメソッドが動作できることに注意してください。また、
1/3
の上と下に小さな矢印があることにも注意してください。2 番目のメソッドのオーバーロードされたバージョンを調べるには、キーボードの下方向キーを押します。
上下の方向キーを使用して、オーバーロードされたさまざまなバージョン間を移動できます。 この操作を行うと、IntelliSense ポップアップの左側に、
1/3
、2/3
、3/3
が表示され、右側に役立つ説明が表示されます。少し時間を取って、
Random.Next()
メソッドのオーバーロードされた各バージョンを調べます。メソッドの 2 番目のオーバーロードされたバージョン
2/3
は、Next()
メソッドで入力パラメーターint maxValue
を受け入れることができることを示します。 説明によって、maxValue
がNext()
メソッドで生成される数値の排他的な上限であることが示されます。 排他的とは、戻り値が maxValue 未満であることを示します。 したがって、dice.Next(1,7);
を指定すると、最大のダイス ロールは 6 になります。 セクションの下部にあるメッセージがReturns a non-negative random integer that is less than the specified maximum.
(指定した最大値より小さい 0 以上のランダムな整数を返します。) に更新されていることに注意してください。メソッドの 3 番目のバージョン
3/3
は、Next()
メソッドでint minValue
とint maxValue
の両方を入力パラメーターとして受け入れることができることを示します。 新しいパラメーターminValue
は、Next()
メソッドで生成される数値の下限です。 下限は排他的ではなく包括的であるため、戻り値はminValue
と等しい場合があります。 下部のメッセージには、Returns a random integer that is within a specified range.
(指定した範囲内のランダムな整数を返します。) というメッセージが表示されます。この場合、IntelliSense によって、
maxValue
とminValue
の詳細な説明など、適切なオーバーロードを選択するために必要なすべての情報が提供されます。 ただし、メソッドのドキュメントを参照する必要がある状況が発生する場合があります。
learn.microsoft.com からオーバーロードされたメソッドに関する情報を得る
メソッドのオーバーロードされたバージョンについて学習する 2 番目の方法は、メソッドのドキュメントを参照することです。 ドキュメントは、各入力パラメーターの目的を正確に理解するのにも役立ちます。
まず、任意の Web ブラウザーと検索エンジンを開きます。
C# Random.Next() の検索を実行します
検索には、クラス名とメソッド名が含まれている必要があります。 誤って他のプログラミング言語の結果を得ることがないように、
C#
という語句を含めることもできます。https://learn.microsoft.com
で始まる URL を含む上位の検索結果を選択します。上位の検索結果の 1 つとして、
https://learn.microsoft.com
で始まる URL が表示されるはずです。 この場合、リンクのタイトルはRandom.Next Method
として表示されます。検索エンジンを使用して検索する際に問題が発生した場合は、以下のリンクを参照してください。
C# Random.Next() のリンクを開きます。
ドキュメントに目を通します。
ページの内容を下にスクロールして、さまざまなコード サンプルを確認します。 ブラウザー ウィンドウでサンプルを実行できることに注意してください。
learn.microsoft.com のドキュメントでは、.NET クラス ライブラリの各クラスとメソッドの標準形式に従います。
Web ページの上部にある「オーバーロード」というラベルの付いたセクションを見つけます。
3 つのオーバーロードされたバージョンのメソッドが一覧表示されていることに注意してください。 一覧表示されているオーバーロードされた各バージョンには、ページのさらに下の場所へのハイパーリンクが含まれています。
"ページ上" で 2 つ目のオーバーロードされたバージョンの説明に移動するには、「Next(Int32)」を選択します。
メソッドの各バージョンのドキュメントには、次のものが含まれます。
- メソッドの機能の簡単な説明
- メソッドの定義
- メソッドで受け入れられる入力パラメーター
- 戻り値
- 発生する可能性のある例外
- 使用されるメソッドの例
- メソッドに関するその他の注釈
少し時間を取って「パラメーター」セクションを確認します。
「パラメーター」セクションでは、
maxValue
入力パラメーターは "生成される乱数の排他的な上限である" と示されています。"排他的な上限" とは、10
未満の数値が必要な場合、11
という値を渡す必要があることを意味します。また、次の行には、"
maxValue
は 0 以上でなければならない" と示されています。この記述を無視するとどうなるのでしょうか? 「例外」セクションには、maxValue
が 0 未満である場合、メソッドでArgumentOutOfRangeException
が返されると示されています。Note
learn.microsoft.com のコンテンツは、.NET クラス ライブラリの "信頼できるソース" です。 特定のメソッドのしくみを理解するために、ドキュメントを読む時間を取ることが重要です。
要点
- メソッドでは、その設計および実装方法に応じて、パラメーターを受け入れない場合や、複数のパラメーターを受け入れる場合があります。 複数の入力パラメーターを渡す場合は、それらを
,
記号で区切ります。 - メソッドでは、タスクの完了時に値が返される場合や、何も返されない場合があります (void)。
- オーバーロードされたメソッドでは、メソッドの複数の実装がサポートされ、それぞれに一意のメソッド シグネチャ (入力パラメーターの数、および各入力パラメーターのデータ型) があります。
- Intellisense は、コードをより迅速に記述するのに役立ちます。 メソッド、その戻り値、オーバーロードされたバージョン、および入力パラメーターの型に関するクイック リファレンスが提供されます。
- learn.microsoft.com は、.NET クラス ライブラリでメソッドがどのように動作するかを学習する場合の "信頼できる情報源" です。