|
|
連載:C# 4入門
第4回 引数の省略と順番の変更
株式会社ピーデー 川俣 晶
2010/10/15 |
|
|
順番の変更
C# 4では、呼び出し側で引数に名前を指定することができる。これを行うと、宣言された順番に関係なく引数を記述できる。
以下に使用例をお見せしよう。5個のmyMethod呼び出しはすべて有効である。
using System;
class Program
{
private static void myMethod(int a = -1, string b = null)
{
if (b != null)
Console.WriteLine("{0}さんはテストを受けました。", b);
if (a >= 0)
Console.WriteLine("{0}点でした。", a);
}
static void Main(string[] args)
{
myMethod();
myMethod(a: 100);
myMethod(b: "ハナコ");
myMethod(a: 50, b: "タロウ");
myMethod(b: "ジロウ", a: 75);
}
}
|
|
リスト7 |
100点でした。
ハナコさんはテストを受けました。
タロウさんはテストを受けました。
50点でした。
ジロウさんはテストを受けました。
75点でした。
|
|
リスト7の実行結果 |
つまり、引数に名前を付けて使うと、順番の変更も自由自在であるだけでなく、引数の省略機能と合わせて「指定したい引数だけ」に値を指定することすらできてしまう。これは、単に省略時の引数値を指定するのとは次元の違う、豊かな機能といえる。
ピンポイントで指定せよ
引数の順番の変更は、いま1つありがたみが分かりにくい。というのは、従来のメソッド呼び出しの書式を使用し、宣言された引数と同じ順番で書くようにしておけば、特別な新しい機能を覚える必要もなく、しかも名前を指定する必要がないので短く書ける。
実際にありがたみを感じられる事例を以下に紹介しよう。
using System;
using System.IO;
class Program
{
private static void Output(
TextWriter writer = null,
string val = "This is default string" )
{
if (writer == null)
Console.WriteLine(val);
else
writer.WriteLine(val);
}
static void Main(string[] args)
{
Output(Console.Out, "New Value");
}
}
|
|
リスト8 |
Outputメソッドはもともと引数省略時にコンソールに出力するという機能を持っている。だから、呼び出すときにConsole.Outを渡す必要は本来ならないはずだ。それにもかかわらず渡しているのは、後続の引数を記述すると手前の引数が省略できないからだ。
しかし、引数に名前を付けると順番の制約から解放される。Outputメソッド呼び出しは以下のように書き換えることができ、これで動作する。
Output(val: "New Value");
|
|
まとめ
今回のまとめ。
- 引数は省略できる
- 省略時の値は指定できる
- その値は定数である必要がある
- その値を変更したときは、呼び出し側も再コンパイルを要する
- null許容型との相性がよい
- 呼び出し側で引数に名前を付けると、順番を入れ替えることができる
- 従来から属性で使用できた引数の省略や順番の変更とは、機能として別物である
ちなみに、省略時の値を指定する機能はVisual Basicでは昔から使用できた機能なので、C#でサポートされたことは取りあえず喜ばしい。いくつかの機能ではVisual Basicの方が優越していることも事実だったからである。
しかし、あまり安易に喜んでもいられない面もある。というのは、この機能を使うことで確実に良くなるとはいい切れないからだ。例えば、「同じ名前のメソッドが2つ用意されていた」としよう。そのとき、引数の少ない方のバージョンを廃して、引数の多いバージョンにデフォルト値を使用して同じように呼び出せるように手直しをしたとしよう。だが、メモリの使い方は同じではない。引数が少ないメソッド呼び出しであっても、足りない引数を補って呼び出しているだけであり、実行時の引数は減らない。ということは多い方に一本化するとメモリ使用量は増えてしまうのである。
このことは、引数の省略という機能が安易にC#に導入されず、バージョン4になって初めて入ってきた理由を示唆する。つまり、安易に多用はできない機能なのである。
しかし、それを踏まえてもなお、引数が省略できる機能には魅力がある。ソース・コードをすっきりまとめられる可能性があるからだ。そして、多少のメモリの無駄はPCのスペックの上昇で問題なくなってしまうかもしれない。いずれにせよ、判断するのも使うのも読者の皆さんである。
Insider.NET 記事ランキング
本日
月間