|
|
連載:C# 4入門
第4回 引数の省略と順番の変更
株式会社ピーデー 川俣 晶
2010/10/15 |
|
C#の弱点といえば
C#にはけっこう弱点がある。まじめにそこを突いていけば、C#のイメージを貶(おとし)めることもできると思うが、意外とそういう話をしている例に出会わない。
より正確にいうと、C#の弱点に言及している人は、実は“アンチC#派”ではないケースが多いように感じられる。つまり、前向きに「改善に期待する」という態度になってしまい、C#のイメージを落とす方向には進みそうもない。ではアンチC#派は何を批判しているのかといえば、ほとんどがC#プログラマーからすれば弱点でも何でもない「流儀の違い」や「単なる誤認」でしかない要素を攻撃してくるが、そこは攻撃されても痛くもかゆくもない。
結局、そのような弱点は多いものの、それが致命的な問題に直結していないのは、それが回避可能なささいな問題にすぎないことが多いためだろう。
しかし、コードを書いている側から見れば、ささいな問題でも改善されれば大助かりだ。それによって、無駄な回避コードを書かなくて済むようになれば、それだけ手間が減る。
さて、具体的なC#の弱点の1つに、「引数を省略できない」という問題がある。この問題は、メソッドのオーバーロードによって解決できるが、不必要にソースが長くなりがちであった。そして、これはC# 4で解決されている。今回はその具体的な内容を見ていこう。
属性の事例
引数の省略(および順番の変更)という機能は、属性に限ってはC# 1.0よりサポートされていた。以下のようなソース・コードは昔から有効である。
using System;
class SampleAttribute : Attribute
{
public string A = "I'm A";
public string B = "I'm B";
}
[Sample(A = "Hello ",B = "World")]
class Program
{
static void Main(string[] args)
{
var a = typeof(Program)
.GetCustomAttributes(typeof(SampleAttribute), false);
Console.WriteLine(((SampleAttribute)a[0]).A);
Console.WriteLine(((SampleAttribute)a[0]).B);
}
}
|
|
リスト1 |
ここで属性を以下のように変更し、引数の順番を入れ替えても結果は変わらない。
[Sample(B = "World", A = "Hello ")]
|
|
引数の順番を入れ替えた属性指定 |
また、引数Bを省略してしまうと、デフォルト値がそのまま有効になる。
つまり、順番の変更も引数の省略も、属性ではすでに可能だったのである。C# 4で拡張された新機能は、これとはまったくの別物である。属性に限らず、どのようなクラスのメソッドでも使用できる、もっと汎用的な仕掛けだ。
引数の省略
高機能メソッドは、引数が多くなる傾向にある。しかし、それらの機能をすべて使うことはあまりない。そこで、引数の少ないメソッドも同時に提供することがよく行われる。
例えば以下のように、同じ名前で引数が異なるメソッドが提供される事例は多く、クラス・ライブラリにも多くの事例を見つけられる。
using System;
class Program
{
private static void myMethod(int a, string b)
{
if (b != null)
Console.WriteLine("{0}さんはテストを受けました。", b);
if (a >= 0)
Console.WriteLine("{0}点でした。", a);
}
private static void myMethod(int a)
{
myMethod(a, null);
}
static void Main(string[] args)
{
myMethod(100);
myMethod(50, "タロウ");
}
}
|
|
リスト2 |
100点でした。
タロウさんはテストを受けました。
50点でした。
|
|
リスト2の実行結果 |
これは、C# 4では以下のように書き換えることができる。
using System;
class Program
{
private static void myMethod(int a, string b = null)
{
if (b != null)
Console.WriteLine("{0}さんはテストを受けました。", b);
if (a >= 0)
Console.WriteLine("{0}点でした。", a);
}
static void Main(string[] args)
{
myMethod(100);
myMethod(50, "タロウ");
}
}
|
|
リスト3 |
ここでのポイントは、引数bの省略時の値を指定されたことにより、省略時にはその値が指定されるようになったことだ。その結果として、引数1つのmyMethodは丸ごと消えてなくなるが、実行させると結果は同じになる。
Insider.NET 記事ランキング
本日
月間