.NET クラス ライブラリでのさまざまな種類のメソッドの呼び出し

完了

Console.WriteLine() メソッドを使用するときに、コードの最初の行からメソッドを呼び出しています。 すべてのクラスとメソッドが同じ方法で実装されるわけではありません。 このユニットでは、.NET クラス ライブラリのメソッドを使用するときに理解しておく必要がある、最も一般的ないくつかのバリエーションについて説明します。 さらに重要なのは、各メソッドについてさらに理解を深めるために、ドキュメントを見つけて使用する方法を学習することです。

.NET クラス ライブラリでメソッドを呼び出す方法

Console.WriteLine() メソッドを使用した以前の経験から、以下の基本については既に理解しているはずです。

  • まず、クラス名である Console を入力する
  • メンバー アクセス演算子である . 記号を追加する
  • メソッドの名前である WriteLine を追加する
  • メソッド呼び出し演算子である一組のかっこ () を追加する
  • 最後に、Console.WriteLine() メソッドで左かっこと右かっこの間の入力パラメーターとして出力する値 ("Hello World!" など) を追加する

場合によっては、開発者が特定のメソッドを設計および実装した方法に応じて、次の操作が必要になります。

  • 入力パラメーターとして追加の値を渡す
  • 戻り値を受け入れる

入力パラメーターと戻り値については、次のユニットで説明します。

いくつかのメソッドは、Console.WriteLine() を呼び出したのと同じ方法で呼び出すことができますが、.NET クラス ライブラリには異なる方法を必要とする他のメソッドがあります。

.NET クラス ライブラリでのさまざまな種類のメソッドの呼び出し

次の例では、乱数を生成し、それをコンソールに出力することにより、ダイス ロールをシミュレートしています。

Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);

コードを複数回実行すると、1 から 6 の数値がコンソール出力に表示されます。

まず、コードの各行で行われる内容を見ていきましょう。その後、いくつかの重要な質問をして、.NET クラス ライブラリでのクラスとメソッドの操作について、いくつか観察します。

コードの最初の行では、.NET クラス ライブラリで System.Random クラスの新しいインスタンスを作成し、dice という名前の変数に新しいオブジェクトへの参照を格納します。

コードの 2 番目の行では、dice オブジェクトの Next() メソッドを呼び出して、2 つのパラメーター (乱数の最小値と最大値) を渡します。 Next() メソッドから値が返されます。これを、roll という名前の変数に保存します。

コードの 3 番目の行では、WriteLine() メソッドを呼び出して、roll の値をコンソールに出力します。

このコード例では、Random クラスと Console クラスのメソッドを呼び出しています。 しかし、これらのメソッドを呼び出す 方法 は異なります。 異なる手法を使用して呼び出される理由は、一部のメソッドがステートフルで、その他がステートレスであるためです。

ステートレス メソッドとステートフル メソッド

コンピューティングでは、状態 は特定の時点での実行環境の状況を示します。 コードを 1 行ずつ実行すると、値が変数に格納されます。 実行中はいつでも、アプリケーションの現在の状態が、メモリに格納されているすべての値のコレクションとなります。

一部のメソッドは、アプリケーションの現在の状態に依存せずに正しく動作します。 つまり、ステートレス メソッド は、既にメモリに格納されている値を参照したり変更したりせずに動作できるように実装されています。 ステートレス メソッドは、静的メソッド とも呼ばれます。

たとえば、Console.WriteLine() メソッドはメモリに格納されている値に依存しません。 関数を実行し、いかなる場合もアプリケーションの状態に影響を与えることなく完了します。

しかし、その他のメソッドでは、正しく動作するためにアプリケーションの状態にアクセスできる必要があります。 つまり、ステートフル メソッド は、既に実行されているコードの前の行によってメモリに格納された値に依存するように構築されています。 または、値を更新したり、新しい値をメモリに格納したりすることによって、アプリケーションの状態を変更します。 これらは、インスタンス メソッド とも呼ばれます。

ステートフル (インスタンス) メソッドでは、クラスで定義された変数である、フィールド で状態を追跡します。 クラスの新しい各インスタンスでは、状態を格納するフィールドの独自のコピーを取得します。

単一のクラスでステートフル メソッドとステートレス メソッドの両方をサポートできます。 しかし、ステートフル メソッドを呼び出す必要がある場合は、まず、クラスの インスタンス を作成し、メソッドで状態にアクセスできるようにする必要があります。

クラスのインスタンスの作成

クラスのインスタンスは、オブジェクト と呼ばれます。 クラスの新しいインスタンスを作成するには、new 演算子を使用します。 dice という新しいオブジェクトを作成するために、Random クラスの新しいインスタンスを作成する次のコード行について考えてみます。

Random dice = new Random();

new 演算子では、次のいくつかの重要な作業を行います。

  • まず、Random クラスに基づいて、新しいオブジェクトを格納するのに十分な大きさのコンピューターのメモリ内のアドレスを要求します。
  • 新しいオブジェクトが作成され、メモリ アドレスで格納されます。
  • メモリ アドレスを返して、dice 変数に保存できるようにします。

それ以降は、dice 変数が参照されると、.NET ランタイムではバックグラウンドで検索が行われるため、ユーザーがオブジェクト自体を直接操作しているように見えます。

Next() メソッドがステートフルである理由

Next() メソッドがなぜステートフル メソッドとして実装されたのかと思われるかもしれません。 .NET クラス ライブラリ デザイナーは、状態を要求せずに乱数を生成する方法を見つけられなかったのか? また、Next() メソッドによって格納または参照されるものは正確には何なのか?

これらはもっともな質問です。 大まかに言えば、コンピューターは、信頼できる反復可能な結果を得るために具体的な指示に従うのに適しています。 ランダムに見えるように、Next() メソッドの開発者は、日付と時刻をミリ秒部分までキャプチャし、それを使用して、毎回異なる数値を生成するアルゴリズムをシードすることにしました。 完全にランダムであるわけではありませんが、ほとんどのアプリケーションでは十分です。 dice オブジェクトの有効期間を通じてキャプチャおよび維持される状態は、シード値です。 それ以降の Next() メソッドの各呼び出しでアルゴリズムが再実行されますが、確実にシードが変更されるため、同じ値が (必然的に) 返されないようになります。

しかし、Random.Next() を使用するのに、その "しくみ" を理解する必要はありません。 覚えておくべき重要なことは、メソッドを呼び出す前に、クラスのインスタンスを作成する必要があるメソッドと、そうではないメソッドがあることです。

メソッドを呼び出す前に、クラスのインスタンスを作成する必要があるかどうかをどのように判断するのか

メソッドを呼び出す方法について学習する 1 つの方法は、ドキュメントを参照することです。 メソッドをオブジェクト インスタンスから呼び出す必要があるか、クラスから直接呼び出す必要があるかを示す例が見つかります。

注意

このドキュメントで特に役立つ箇所が、調べているメソッドの使用方法を示すコード例です。 場合によっては、Web ページを下にスクロールしてコード例を見つける必要があります。

または、クラス自体から直接メソッドにアクセスしてみることもできます。 最悪の場合、コンパイル エラーが発生する可能性があります。

.NET エディターに次のコード行を入力すると、次のようになります。

int result = Random.Next();

赤い波線が表示され、コンパイル エラーが発生していることが示されます。 マウス カーソルを赤い波線に合わせると、ポップアップが表示され、次のメッセージが示されます。

(1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'

要点

  • .NET クラス ライブラリでクラスのメソッドを呼び出すには、ClassName.MethodName() という形式を使用します。この . 記号は、クラスで定義されているメソッドにアクセスするためのメンバー アクセス演算子であり、() 記号はメソッド呼び出し演算子です。
  • ステートレス メソッドを呼び出す場合は、最初にそのクラスの新しいインスタンスを作成する必要はありません。
  • ステートフル メソッドを呼び出す場合は、クラスのインスタンスを作成し、オブジェクトのメソッドにアクセスする必要があります。
  • クラスの新しいインスタンスを作成するには、new 演算子を使用します。
  • クラスのインスタンスは、オブジェクト と呼ばれます。