連載:C# 4入門

第4回 引数の省略と順番の変更

株式会社ピーデー 川俣 晶
2010/10/15
Page1 Page2 Page3

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

Hello
World
リスト1の実行結果

 ここで属性を以下のように変更し、引数の順番を入れ替えても結果は変わらない。

[Sample(B = "World", A = "Hello ")]
引数の順番を入れ替えた属性指定

 また、引数Bを省略してしまうと、デフォルト値がそのまま有効になる。

[Sample(A = "Hello ")]
引数Bを省略した属性指定

Hello
I'm B
引数Bを省略した場合のリスト1の実行結果

 つまり、順番の変更も引数の省略も、属性ではすでに可能だったのである。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は丸ごと消えてなくなるが、実行させると結果は同じになる。

 

 INDEX
  C# 4入門
  第4回 引数の省略と順番の変更
  1.C#の弱点といえば/属性の事例/引数の省略
    2.可変値指定不可能/定数の正しい意味/無効値選定の重要性
    3.順番の変更/ピンポイントで指定せよ/まとめ
 
インデックス・ページヘ  「C# 4入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間