連載:C# 4入門

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

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

順番の変更

 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

New Value
リスト8の実行結果

 Outputメソッドはもともと引数省略時にコンソールに出力するという機能を持っている。だから、呼び出すときにConsole.Outを渡す必要は本来ならないはずだ。それにもかかわらず渡しているのは、後続の引数を記述すると手前の引数が省略できないからだ。

 しかし、引数に名前を付けると順番の制約から解放される。Outputメソッド呼び出しは以下のように書き換えることができ、これで動作する。

Output(val: "New Value");

まとめ

 今回のまとめ。

  • 引数は省略できる
  • 省略時の値は指定できる
  • その値は定数である必要がある
  • その値を変更したときは、呼び出し側も再コンパイルを要する
  • null許容型との相性がよい
  • 呼び出し側で引数に名前を付けると、順番を入れ替えることができる
  • 従来から属性で使用できた引数の省略や順番の変更とは、機能として別物である

 ちなみに、省略時の値を指定する機能はVisual Basicでは昔から使用できた機能なので、C#でサポートされたことは取りあえず喜ばしい。いくつかの機能ではVisual Basicの方が優越していることも事実だったからである。

 しかし、あまり安易に喜んでもいられない面もある。というのは、この機能を使うことで確実に良くなるとはいい切れないからだ。例えば、「同じ名前のメソッドが2つ用意されていた」としよう。そのとき、引数の少ない方のバージョンを廃して、引数の多いバージョンにデフォルト値を使用して同じように呼び出せるように手直しをしたとしよう。だが、メモリの使い方は同じではない。引数が少ないメソッド呼び出しであっても、足りない引数を補って呼び出しているだけであり、実行時の引数は減らない。ということは多い方に一本化するとメモリ使用量は増えてしまうのである。

 このことは、引数の省略という機能が安易にC#に導入されず、バージョン4になって初めて入ってきた理由を示唆する。つまり、安易に多用はできない機能なのである。

 しかし、それを踏まえてもなお、引数が省略できる機能には魅力がある。ソース・コードをすっきりまとめられる可能性があるからだ。そして、多少のメモリの無駄はPCのスペックの上昇で問題なくなってしまうかもしれない。いずれにせよ、判断するのも使うのも読者の皆さんである。End of Article

 

 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 記事ランキング

本日 月間