演習 - .NET クラスのメソッドを呼び出す
- 12 分
気付いているかどうかにかかわらず、最初の "Hello, World!" アプリケーション以降、C# メソッドを呼び出しています。 そのアプリケーションでは、WriteLine() クラスの Console メソッドを使用して "Hello, World!" メッセージを表示します。
ただし、すべてのクラスとメソッドが同じように実装されるわけではありません。 このユニットでは、.NET クラス ライブラリのメソッドを使用するときに理解しておく必要がある最も一般的ないくつかのバリエーションについて説明します。 さらに重要なのは、各メソッドについてさらに理解を深めるために、ドキュメントを見つけて使用する方法を学習することです。
.NET クラス ライブラリでメソッドを呼び出す方法
Console.WriteLine() メソッドを使用した以前の経験から、以下の基本については既に理解しているはずです。
- 最初にクラス名を入力する。 この場合、クラス名は
Console。 - メンバー アクセス演算子である
.記号を追加する。 - メソッドの名前を追加する。 この場合、メソッドの名前は
WriteLine。 - メソッド呼び出し演算子である一組のかっこ
()を追加する。 - 最後に、メソッドに渡される引数がある場合、メソッド呼び出し演算子のかっこ内にその引数を指定する。 この場合、
Console.WriteLine()メソッドでコンソールに書き込むテキスト (たとえば、"Hello World!"など) を指定する。
場合によっては、開発者が特定のメソッドを設計および実装した方法に応じて、次の操作が必要になります。
- 入力パラメーターとして追加の値を渡す。
- 戻り値を受け入れる。
次のユニットでは、入力値をメソッドに渡す方法と、メソッドを使用して値を呼び出し元ルーチンに返す方法を調べます。
一部のメソッドは、Console.WriteLine() を呼び出したときと同じ方法で呼び出すことができますが、.NET クラス ライブラリには異なる方法を必要とするその他のメソッドもあります。
コーディング環境を準備する
このモジュールには、サンプル コードをビルドして実行するプロセスをガイドするコーディング アクティビティが含まれています。 これらのアクティビティを完了するために、開発環境として Visual Studio Code を使用することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く] ダイアログで、Windows デスクトップ フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選びます。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[ はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 例えば次が挙げられます。
C:\Users\someuser\Desktop>注
サンドボックスやホスト環境ではなく、自分の PC で作業しており、この C# シリーズの他の Microsoft Learn モジュールを完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている可能性があります。 その場合は、[TestProject] フォルダーにコンソール アプリケーションを作成する次の手順をスキップできます。
ターミナル コマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、次のプロンプトを入力します。
dotnet new console -o ./CsharpProjects/TestProjectこの .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドでは、CsharpProjects および TestProject フォルダーが自動的に作成され、
.csprojファイルの名前として TestProject が使用されます。ファイルが既に存在することを示すメッセージが表示される場合は、次の手順に進みます。 既存のプロジェクト ファイルを再利用します。
エクスプローラー ビューで、 CsharpProjects フォルダーを 展開します。
TestProject フォルダーと、Program.cs という名前の C# プログラム ファイルと TestProject.csproj という名前の C# プロジェクト ファイルの 2 つのファイルが表示されます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く ] ダイアログで、 CsharpProjects フォルダーを選択し、[フォルダーの選択] を 選択します。
エクスプローラー ビューで、TestProject フォルダーを展開し、 Program.csを選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルを作成、ビルド、および実行します。
[ターミナル] パネルを閉じます。
.NET クラス ライブラリ内のさまざまな種類のメソッドを呼び出す
Visual Studio Code エディターで、
System.RandomクラスとSystem.Consoleクラスのメソッドを実装するコード サンプルを作成するには、次のコードを入力します。Random dice = new Random(); int roll = dice.Next(1, 7); Console.WriteLine(roll);このコードは、
Random.Next()メソッドを使用して数値を生成し、Console.WriteLine()メソッドを使用して値を表示することで、サイコロの転がりをシミュレートします。注
このコードについては、このユニットで後ほど詳しく説明します。
Visual Studio Code [ファイル] メニューの [保存] をクリックします。
エクスプローラー ビューで、TestProject フォルダーの場所でターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。
ターミナル パネルには、フォルダー パスを表示するコマンド プロンプトが含まれていることに注意してください。 例えば次が挙げられます。
C:\Users\someuser\Desktop\CsharpProjects\TestProject>ターミナルを使用して .NET CLI コマンドを実行すると、表示されるフォルダーの場所からコマンドが実行されます。 コードをビルドまたは実行する前に、コード フォルダーが、コマンド プロンプトに表示されるフォルダー パスと一致していることを確認します。
ターミナル コマンド プロンプトで、コードを実行するには、「 dotnet run 」と入力し、Enter キーを押します。
コンソール出力に 1 から 6 までの数値 (サイコロの目の数) が表示されることに注意してください。 コードを十分に実行すると、各数値 1 から 6 が表示されます。
ここで、
Next()およびWriteLine()メソッドへのアクセスに使用される構文を少し見てみることにしましょう。これらのメソッドにアクセスするには、異なる手法を使用することに注意してください。
Random dice = new Random(); int roll = dice.Next(1, 7); Console.WriteLine(roll);3 番目のコード行では、
Consoleクラスへの参照を含め、Console.WriteLine()メソッドを直接呼び出します。 しかし、Random.Next()メソッドの呼び出しには別の手法を使用します。 2 つの異なる手法を使用するのは、"ステートフル" メソッドと "ステートレス" メソッドがあるためです。 次のセクションでは、ステートフル メソッドとステートレス メソッドの違いを調べます。
ステートレス メソッドとステートフル メソッド
ソフトウェア開発プロジェクトでは、ステートという用語は、特定の時点での実行環境の状態を言い表すために使用されます。 コードを 1 行ずつ実行すると、値が変数に格納されます。 実行中はいつでも、アプリケーションの現在の状態が、メモリに格納されているすべての値のコレクションとなります。
一部のメソッドは、アプリケーションの現在の状態に依存せずに正しく動作します。 つまり、ステートレス メソッドは、既にメモリに格納されている値を参照したり変更したりせずに動作できるように実装されています。 ステートレス メソッドは、静的メソッドとも呼ばれます。
たとえば、Console.WriteLine() メソッドはメモリに格納されている値に依存しません。 関数を実行し、いかなる場合もアプリケーションの状態に影響を与えることなく完了します。
しかし、その他のメソッドでは、正しく動作するためにアプリケーションの状態にアクセスできる必要があります。 つまり、ステートフル メソッドは、既に実行された前のコード行によってメモリに格納された値に依存するように構築されています。 または、値を更新したり、新しい値をメモリに格納したりすることによって、アプリケーションの状態を変更します。 これらは、インスタンス メソッドとも呼ばれます。
ステートフル (インスタンス) メソッドでは、クラスで定義された変数である、フィールド で状態を追跡します。 クラスの新しい各インスタンスでは、状態を格納するフィールドの独自のコピーを取得します。
単一のクラスでステートフル メソッドとステートレス メソッドの両方をサポートできます。 しかし、ステートフル メソッドを呼び出す必要がある場合は、まず、クラスのインスタンス を作成し、メソッドで状態にアクセスできるようにする必要があります。
クラスのインスタンスの作成
クラスのインスタンスはオブジェクトとして呼び出 されます。 クラスの新しいインスタンスを作成するには、new 演算子を使用します。
Random という新しいオブジェクトを作成するために、dice クラスの新しいインスタンスを作成する次のコード行について考えてみます。
Random dice = new Random();
new 演算子では、次のいくつかの重要な作業を行います。
- まず、
Randomクラスに基づいて、新しいオブジェクトを格納するのに十分な大きさのコンピューターのメモリ内のアドレスを要求します。 - 新しいオブジェクトが作成され、メモリ アドレスで格納されます。
- メモリ アドレスを返して、
diceオブジェクトに保存できるようにします。
それ以降は、dice オブジェクトがコードで参照されると、.NET ランタイムではバックグラウンドで検索が行われるため、ユーザーがオブジェクト自体を直接操作しているように見えます。
コードでは、dice クラスの状態を格納する変数のように、Random オブジェクトを使用します。
Next() オブジェクトで dice メソッドを呼び出すと、このメソッドでは、dice オブジェクトに格納されている状態を使用して乱数が生成されます。
最新バージョンの .NET ランタイムを使用すると、型名を繰り返すことなく、オブジェクトをインスタンス化することができます (ターゲット型コンストラクターの呼び出し)。 たとえば、次のコードでは Random クラスの新しいインスタンスが作成されます。
Random dice = new();
その意図は、コードを読みやすく簡素化することです。 ターゲット型の new 式を記述する際は、常にかっこを使用します。
Next() メソッドがステートフルである理由
Next() メソッドがなぜステートフル メソッドとして実装されたのかと思われるかもしれません。 .NET クラス ライブラリ デザイナーは、状態を要求せずに乱数を生成する方法を見つけられなかったのか? また、Next() メソッドによって格納または参照されるものは正確には何なのか?
これらはもっともな質問です。 大まかに言えば、コンピューターは、信頼できる反復可能な結果を得るために具体的な指示に従うのに適しています。 ランダムに見えるように、Next() メソッドの開発者は、日付と時刻をミリ秒部分までキャプチャし、それを使用して、毎回異なる数値を生成するアルゴリズムをシードすることにしました。 完全にランダムであるわけではありませんが、ほとんどのアプリケーションでは十分です。
dice オブジェクトの有効期間を通じてキャプチャおよび維持される状態は、シード値です。 それ以降の Next() メソッドの各呼び出しでアルゴリズムが再実行されますが、確実にシードが変更されるため、同じ値が (必然的に) 返されないようになります。
しかし、Random.Next() メソッドを使うために、その "しくみ" を理解する必要はありません。 呼び出す前にクラスのインスタンスを作成する必要があるメソッドと、そうではないものがあるということを知っておくことが重要です。
メソッドを呼び出す前に、クラスのインスタンスを作成する必要があるかどうかをどのように判断するのか
メソッドがステートフルまたはステートレスのどちらであるかを判断する方法の 1 つは、ドキュメントを参照することです。 ドキュメントには、メソッドをオブジェクト インスタンスから呼び出す必要があるか、またはクラスから直接呼び出す必要があるかを示す例が含まれています。
注
コード例を見つけるには、ドキュメント ページを下にスクロールすることが必要な場合があります。
製品ドキュメントを検索する代わりに、クラス自体から直接メソッドにアクセスすることができます。 機能する場合は、ステートレス メソッドであることがわかります。 最悪の場合、コンパイル エラーが発生する可能性があります。
Random.Next() メソッドに直接アクセスして、何が起こるかを確認してみましょう。
Visual Studio Code エディターに次のコード行を入力します。
int result = Random.Next();Next()がステートフル メソッドであることは既にわかっていますが、この例は、誤った方法でメソッドにアクセスしようとしたときに Visual Studio Code エディターがどのように反応するかを示しています。Random.Nextの下に赤い波線が表示されていることに注意してください。これは、コンパイル エラーがあることを示しています。使用したいメソッドがステートレスの場合、赤い波線は表示されません。
赤い波線の上にマウス ポインターを置きます。
次のメッセージを表示したポップアップ ウィンドウが表示されます。
(1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'このユニットの最初のコードで見たように、
Randomメソッドにアクセスする前にNext()クラスのインスタンスを作成することで、このエラーを修正できます。 例えば次が挙げられます。Random dice = new Random(); int roll = dice.Next();この場合、
Next()メソッドは、入力パラメーターを指定しないで呼び出します。
まとめ
- .NET クラス ライブラリでクラスのメソッドを呼び出すには、
ClassName.MethodName()という形式を使用します。この.記号は、クラスで定義されているメソッドにアクセスするためのメンバー アクセス演算子であり、()記号はメソッド呼び出し演算子です。 - ステートレス メソッドを呼び出す場合は、最初にそのクラスの新しいインスタンスを作成する必要はありません。
- ステートフル メソッドを呼び出す場合は、クラスのインスタンスを作成し、オブジェクトのメソッドにアクセスする必要があります。
- クラスの新しいインスタンスを作成するには、
new演算子を使用します。 - クラスのインスタンスはオブジェクトとして呼び出 されます。