for WPF developers
Home Profile Tips 全記事一覧

メソッドチェーンについて

(2017/03/14 11:31:38 created.)

System.Linq の拡張メソッドを使用したコードでは、メソッドチェーンによるコードが良く見られます。メソッドチェーンとは、メソッドの戻り値をいちいち変数に戻したりせず、直接メソッドを繋げる書き方のことです。例えば次のような書き方ができます。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             // メソッドチェーンを使わない場合
  11.             var numbers = Enumerable.Range(1, 100);
  12.             var numbers2 = numbers.Where(x => x % 17 == 0);
  13.             var numbers3 = numbers2.Select(x => 2 * x);
  14.             Console.WriteLine("コレクションの要素は {{ {0} }} です。", string.Join(",  ", numbers3));
  15.  
  16.             // メソッドチェーンを使う場合
  17.             var numbers4 = Enumerable.Range(1, 100).Where(x => x % 17 == 0).Select(x => 2 * x);
  18.             Console.WriteLine("コレクションの要素は {{ {0} }} です。", string.Join(",  ", numbers4));
  19.  
  20.             Console.ReadKey();
  21.         }
  22.     }
  23. }


メソッドチェーンを使用することで無駄なインスタンスを経由することなくシーケンスの操作ができます。また、メソッドを繋いで書くことでシーケンスに対する処理が継続されていることが明示的になるため、コードを読みやすくすることができます。

メソッドチェーンによるシーケンスの処理の流れを次の図に示します。


このように繋いだメソッドごとに各要素が変質していき、それぞれの出力結果に対して後続のメソッドが処理をおこなうことになります。

メソッドチェーンによる書き方をおこなうと、その行がやたらと長くなる傾向になります。そこで、次のようにメソッド単位で改行し、複数行で記述する方法がよく見られます。さらに、メソッドを繋ぐドット "." で揃えるようにインデントを調整する場合もあります。コードの書き方は人それぞれとは思いますが、いずれにせよ見やすいコードを書くように心がけましょう。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var numbers = Enumerable.Range(1, 100)
  11.                                     .Where(x => x % 17 == 0)
  12.                                     .Select(x => 2 * x);
  13.             Console.WriteLine("コレクションの要素は {{ {0} }} です。", string.Join(",  ", numbers));
  14.  
  15.             Console.ReadKey();
  16.         }
  17.     }
  18. }