ここで学習するのが「メソッド」と呼ばれるものです。メソッドはC#特有のものではなく、ほかのプログラミング言語にも出てくる概念になります。
メソッドは「オブジェクト指向」への最初の一歩ともいえる内容になるので、しっかりと学んでおく必要があるだけでなく、エンジニアとして「当たり前」のように使用するものになります。息をするように使用できるようにしなくてはなりません。
まずはメソッドの概念や書き方といった基本事項を学んでから、簡単なアプリケーションを作成してメソッドの作成する方法を学習していきます。
メソッドとは
まずは「メソッドとは何か」という点から学習をスタートしていきます。Microsoftのドキュメントでは以下のように「メソッド」が定義されています。
メソッドは、一連のステートメントが含まれているコード ブロックです。
「一連のステートメントが含まれている」と堅苦しく書かれていますが、簡単に行ってしまうと「処理のまとまりが記述されている」ということになります。メソッドのそもそもの概念は、「同じような処理をまとめて記述しておく(定義しておく)ことで、もう一度使うときに記述する必要がない」ということになります。
プログラミング学習を進めていくと必ず目にする「DRY原則」ですね。DRYとは「Don’t Repeat Yourself.」という意味で「同じことを繰り返すな」という原則です。要するに「同じ処理をわざわざ記述しない」ということを意味しています。
メソッドは「一連の処理」を「パッケージ」にすることができ、後から何度でも再利用するための技術です。DRY原則の根底に位置する考え方になります。今後、プログラミング学習を進めていく上で、とても重要になりますので覚えておく必要があります。
メソッドを利用するには
メソッドを利用するには、ソースコード上でメソッドを定義しなくてはなりません。メソッドの定義の方法は、ほとんど定型文化されているので覚えてしまえば問題ありません。メソッドは以下の順番に定義していきます。
(アクセス修飾子)(戻り値) (メソッド名) (引数)
分かりづらいと思いますので、実際のC#コードで書いておきます。詳しい説明はしませんので、メソッドを定義するときの雰囲気だけまずは感じてもらえればよいかと思います。
//入力値が同じかどうかを判定するメソッド
public bool IsEqualNumber(int original, int comapre)
{
if(original == compare)
{
return true;
}
return false;
}
アクセス修飾子は「public」として、戻り値は「bool型」、そしてメソッド名が「IsEqualNumer」であり、引数が2つありますよという定義になっています。アクセス修飾子については、今後取り上げる内容なので、現時点では気にする必要はありません。
メソッドの戻り値
メソッドを記述する際には戻り値を記載する必要があります。一連の処理をした後に値を返したい場合は、その返したい値の「型」を記述する必要があります。
先ほどのサンプルでいうところの「bool」になります。ほかにもintやstring、doubleなど「型」として使用できるものはなんでも記述することが可能です。ただし、戻り値の型を記述した場合は、必ず戻り値を返すような処理構造にする必要があります。
戻り値を戻す場合に使用するのが「return」になり、「return 〇〇;」と記載します。サンプルでは「return true;」や「return false;」と書いている箇所が該当します。
また、戻り値を記述しない場合もあります。一連の処理をした後で「別に値を返す必要がない」という場合は、「戻り値を持たない」「戻り値を返さない」と明示的に記述することで実現が可能です。
戻り値を持たない場合の明示的な印として「void」を戻り値の代わりに付与することで、「このメソッドは戻り値を持ちません」とすることができます。いかに雰囲気だけつかめるメソッドのサンプルを記述します。
//引数をコンソール画面に表示するだけのメソッド
private void WriteMessage(string input)
{
Console.WriteLine(input);
}
このように「void」を使用すると戻り値を記述する必要がなくなります。これでメソッドの戻り値についてはすべてです。次はメソッドの引数について解説していきます。
メソッドの引数
ということでメソッドの引数について解説します。「引数」とは、メソッドに渡すパラメーターのことであり、メソッド内ので使用できるメソッドの呼び出し元から引き渡される値のことを指します。
引数はメソッド定義の一番最後に定義されるものであり、「型 引数名」で定義することが決まっています。引数の個数は決まっておらず、一般的に何個でも追加して記述することが可能です(普通に使うとしても10個・20個も使うことは少ないはず)。
//引数をコンソール画面に表示するだけのメソッド
private void WriteMessage(string input)
{
Console.WriteLine(input);
}
上記の例でいつならば「string input」の部分が引数に該当します。内部で引数を使用する場合は、「input」と同一の名称にて使用することが可能です。「Console.WriteLine(input);」の部分がまさに「input」を使用している箇所になります。なお、引数を不要とする場合は、引数を記述する必要はありません。例えば以下のように記述することが可能です。
//Hellp World!と表示するメソッド
private void WriteMessage()
{
Console.WriteLine("Hello World!");
}
引数を使用しない場合は上記のように定義すれば問題ありません。必要に応じて使い分ければ大丈夫です。これでいったんはメソッドに関する説明は完了です。実際にサンプルコードをみながら使い方を紹介します。
メソッドを作成してみよう
メソッドの基礎知識については解説しましたので、ここからはサンプルコードを作成しつつメソッドの使い方を解説していきます。新規のコンソールアプリケーションを作って、以下のコードを記述してみましょう。
using System;
namespace App01
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("名前を入力してください。");
string name = Console.ReadLine();
//メッセージを取得するメソッド
string message = GetMessage(name);
//メッセージを表示するメソッド
WriteMessage(message);
Console.ReadLine();
}
//メッセージを取得するメソッド
static private string GetMessage(string name)
{
return "Hello, " + name + "!";
}
//メッセージを表示するメソッド
static private void WriteMessage(string message)
{
Console.WriteLine(message);
}
}
}
上記のコードではメソッドを2つ定義してみました。ではコードについて解説していきます。メソッドを中心として、その周辺も併せて解説していきます。
1つ目のメソッドを解説
1つ目は「戻り値がstring型のメソッドで、string型の引数を1つ取るメソッド」ですね。該当の箇所は以下の通りになります。
//メッセージを取得するメソッド
static private string GetMessage(string name)
{
return "Hello, " + name + "!";
}
引数として渡されるstring型のnameという変数を外側から受け取って、内部でそのまま使用しています。GetMessageメソッドでは文字列を加工して、挨拶する文言を返却するようにしてみました。
アクセス修飾子の箇所である「static private」について、現段階では特に気にせずに「そういうもんだ」と思っていて下さい。もう少し先になってから開設する内容です。ではメソッドを実行する「呼び出し元」をみてみましょう。これまではメソッド自体の解説しなかったため「どう呼ぶか」という箇所が不明瞭でありました。
string message = GetMessage(name);
GetMessageメソッドは、string型の引数を一つ取り、戻り値がstring型のメソッドでした。メソッドを呼び出す時は「メソッド名()」で呼び出すことができます。メソッド名の後の括弧の中に引数を記述します。今回のサンプルでは「name」という引数を渡しています。このnameがどこから来ているかというと、一つ上の行の「string name = Console.ReadLine();」になります。コンソール画面から入力値を取る方法ですね。
「Console.ReadLine()」が分からない人は上記の記事を読んで、コンソール画面から入力値を受け取る方法について確認しておきましょう。お気付きかもしれませんが、「Cnosole.ReadLine()」も実はメソッドなんですね。正確には「ConsoleクラスのReadLineメソッド」ですが、まだクラスは学んでいないので、ここでは「ふーん」程度で知っておいてもらえれば十分かと思います。
戻り値を返す場合は、先ほどにも触れましたが「return 〇〇;」でした。このメソッドでは「return “Hello, ” + name + “!”;」としています。「〇〇;」に対応するのが「”Hello, ” + name + “!”;」となります。
すこし複雑に見えるかもしれませんが、文字列結合をして「Hello, 〇〇!」というメッセージを作成しています。この〇〇の部分が引数である「name」が設定されるわけです。このようにすることで、画面からの入力値(name変数の値)がどんな値であっても、「GetMessageメソッド」は常に「Hello, 〇〇!」というstring型の値を返してくれることになります。
メソッドが汎用性を持っているがゆえ、DRY原則(Don’t Repeat Yourself)の根底にある考えであることがわかると思います。メソッドを作成する場合は「汎用性」を考えて定義する必要があるということです。
2つ目のメソッドを解説
1つ目のメソッドでかなり解説を長く書いてしまいましたので、2つ目のメソッドの解説はサックっと終わらせたいと思います。2つ目のメソッドは以下の箇所に該当しており、処理としては大したことはありません。
//メッセージを表示するメソッド
static private void WriteMessage(string message)
{
Console.WriteLine(message);
}
このメソッドは戻り値を持たない(void)であり、文字列型の引数を1つ取るメソッドであります。このメソッドの処理は非常に簡単で、コンソール画面に文字を出力する処理をかぶせているだけになります。正直言うと、あんまりメソッドにする必要のない処理なのですが、voidであるメソッドのサンプルを作りたくて無理やり定義しました。
//メッセージを表示するメソッド
WriteMessage(message);
先ほどのメソッドは名前を「WriteMessage」としていますので、呼び出し箇所でも「WriteMessage()」と記述します。なお、メソッドに引数がある場合は、必ずメソッドに引数を引き渡す必要があります。間違えて「WriteMessage();」と書いてしまうと、コンパイルすることが出来ないのでご注意ください。
メソッドはたくさん作って覚える
以上、メソッドについては、たくさんの内容を解説してきたので、これで十分かと思います。メソッドは「汎用性」を考えて作成するようにしてみましょう。いかに「使いまわせるメソッドが記述できるか」がプログラマーの腕の見せ所といえます。
メソッドは当たり前のように使用していくので、ここで基礎的な内容をしっかりと学習しておいてください。内容が理解できなかったな、と感じた場合は改めて同じ内容のプロジェクトを作成してみたり、メソッドを改造してみたりしてみましょう。
プログラミング学習には時間がどうしても必要です。目の前のソースを改造してみたり、時には分からなくて悩んでみたりすることが、プログラミング学習では当たり前になります。あなた自身の頭で考え、あなた自身で使い方を肌で感じることができればメソッドをマスターしたといえるでしょう。