メソッド -拡張-

ホームC#プログラミング応用講義 > 拡張

目次

引数

前回のメソッドに関する講義は関数との結びつきを考えて、単純なメソッドを定義しましたが、このページではメソッド の機能を大きく拡張していきましょう。
using System;

class Sample
{
public static void Main(string[] args)
{
Dorama d = new Dorama();

string title,main,sub,cm;

title = "TRICK";
main = "仲間由紀恵";
sub = "阿部寛,生瀬勝久,野際陽子";
cm = "一筋縄ではいかないトリックの世界をスリリング" +
"かつコミカルに描ききったミステリーの怪作。" +
"トリックの背景にひそむ新興宗教、霊感商法、" +
"土俗的な因習などの虚構が暴かれていくシリアスなドラマとしても一流。";

Console.WriteLine(d.Review(title,main,sub,cm));

}
}

class Dorama
{
public string Review(string title,string main,string sub,string cm)
{
string sentence = "";

sentence += "ドラマのタイトル: 『" + title + "』\n";
sentence += "主演: " + main + "\n";
sentence += "共演: " + sub + "\n";
sentence += "紹介文:\n" + cm + "\n";

return sentence;
}
}
どうでもいい部分が妙に長くて、肝心な部分を見落としてしまいそうなサンプルですが、見るべきなのは Dorama クラスに宣言された Review() メソッドです。
その中でも、( と ) の中の引数に注目してください。

このメソッドの引数は4つあります。もうお分かりの通りメソッドは複数の引数を 定義することができます。
そしてそれらの引数はここではすべて string 型ですが、全く別の型でもかまいません。

ただし、仮引数の型と数に会う引数を、実引数には指定しなければなりません。ここでは4つの仮引数があるのに、3つの引数を指定してはいけません。4つで もいけません。
引数の型が、
(string , int , double)
であるとすると、
(int , double , string)
として呼び出してはなりません。これも当然のことです。

さて、「返る」という表現を復習します。ここでは返ってくる値を
変数 = メソッド() ;
のように受けているのではなく、
メソッド(メソッド());
としています。これでもプログラムは正常に動きます。

前回説明したのは、「メソッド()」の部分を帰ってきた値に置き換えるとわかりやすいという ことでした。ここでもそう考えると、
Console.WriteLine(d.Review(title,main,sub,cm));
は以下のように考えられます。
Console.WriteLine(sentence);

また、補充事項ですが1つのメソッドにつき1つの return しかつかえません。return の効用として値を返すだけでなく、プログラムの制御自体を呼び出しもとに 戻すことが含まれるため、return が記述されている場所に到達したらそれ以降に記述された部分は実行されません。

引数は簡単そうに見えて、メソッドの重要な識別要素です。識別要素というのはどのメソッドなのかを判断する材料です。
その1つはメソッド名です。「A()」「B()」という2つのメソッドがあるとしたら、
A();
とすれば A が、
B();
とすれば B のメソッドが呼び出されるのは、メソッド名が識別要素に含まれるからです。識別要素のことを「シ グニチャ」と専門的に呼びます。

複数の引数を利用してメソッドを定義すれば、よりスマートにコーディングすることができます。
上のプログラムはドラマレビュー表示プログラムですが、複数のメソッドを利用していることにより
・タイトル
・主演
・共演
・紹介文
を簡潔に表示できます。複数のドラマレビューになるとより効果が上がります。

ただし、上のプログラムにおける
"ドラマのタイトル"
"主演: "
などをいちいち引数で渡していては本末転倒です。メソッドを利用する意味がありません。

void

メソッドは値を返すのが普通です。ただし、もうお分かりと思いますが値を返さないこともできます。
例えば、上のプログラムの場合
Console.WriteLine();
として表示する機能も Review() メソッドが実装できればより簡潔になります。

値を返さない場合、メソッドに必ずつける返す値の型は無意味になります。かといって適当に宣言してはいけません。
値を返さない場合は
void
を代わりに指定します。
using System;

class Sample
{
public static void Main(string[] args)
{
Dorama d = new Dorama();

string title,main,sub,cm;

title = "TRICK";
main = "仲間由紀恵";
sub = "阿部寛,生瀬勝久,野際陽子";
cm = "一筋縄ではいかないトリックの世界をスリリング" +
"かつコミカルに描ききったミステリーの怪作。" +
"トリックの背景にひそむ新興宗教、霊感商法、" +
"土俗的な因習などの虚構が暴かれていくシリアスなドラマとしても一流。";

d.Review(title,main,sub,cm);
}
}

class Dorama
{
public void Review(string title,string main,string sub,string cm)
{
string sentence = "";

sentence += "ドラマのタイトル: 『" + title + "』\n";
sentence += "主演: " + main + "\n";
sentence += "共演: " + sub + "\n";
sentence += "紹介文:\n" + cm + "\n";

Console.WriteLine(sentence);
}
}
void
キーワードの使用自体は簡単ですが、多少注意が必要です。

void を指定することで1つのメソッドが独立して動くように見えますが、欠点があります。それは値を返さない場合は返ってきた値を処理することをできないことです。
すなわち、値を返さないことによって応用性が低くなるということです。

void ではないほうの始めのプログラムでは、返ってきた値をコンソール画面に表示する以外に、Windows プログラミングの TextBox に表示することもできます。
返ってきた値に文字列処理を施すこともできます。

そのような処理は、値を返さない場合にはできません。コンソールに表示したらそれっきりで、上のような応用性がありません。
よって、
Show()
Close()
などの応用性を必要としないメソッドに関しては void が有用ですが、値を返すほうがいい・値を返さなければならないメソッドも数多く存在します。

メソッドが値を返すかどうかは SDK ドキュメントなどでメソッドを引いて、void が付いているかどうかを調べれば簡単に判断できます。
自分で定義する際は、値を返すかどうかを見極めることが重要です。これは時と場合によって 違ってくるので、どちらがいいともいえません。

ちなみに、どうしても値を複数返したいというのならば、値を返さずに変数を public にしてそれを呼び出せば、基本的に似たように働きます。
ただし、以前に述べたようにセキュリティが低くなりますので乱用は避けるべきです。

これでメソッドの利用に関しては機能的に説明し終わりました。しかし、どのようにコーディングをしていくか、どのように拡張していくかは経験によるもので すから、上のような適当なサンプルでも作らないより作ったほうがいいでしょう。

次回は「メソッドのオーバーロード」という重要な項目をやります。このページから「シグニチャ」という言葉を探して復習しておいてください。

[ ステップアップC# ] [ C#プログラミング応用講義 ]