読者です 読者をやめる 読者になる 読者になる

プログラミング C# - 翔ソフトウェア (Sho's)

C#/.NET/ソフトウェア開発など

ラムダ式は常に匿名メソッドよりシンプルに書ける?

Expression

匿名メソッドとラムダ式の違い」と云う記事で、匿名メソッドとラムダ式の意味の違いについて考えた。

それについて、些細な補足をする。

上の記事中で、「ラムダ式を使った方が、型推論の恩恵を存分に受けられ、書き方がぐっとシンプルになる。」、「一般的には、ラムダ式を使うことで書き方もシンプルになることだし、匿名メソッドは使わずにラムダ式で書くようにした方が良いだろう。」と述べた。

一般的にはこれは真実だ。しかし、ごく稀にだが、ラムダ式よりも匿名メソッドの方がシンプルになることがある。

ラムダ式が匿名メソッドよりシンプルな書き方になる例

上の記事で述べたように、通常は、ラムダ式の方が型推論が強力なので、シンプルに書ける。

かなり極端な例だが、

using System;

class Subject
{
    public event Action<Subject, object, object, object, object, object> Update;
}

class Program
{
    static void DoSomething(Subject subject)
    {}

    static void Main()
    {
        var subject = new Subject();

        // 匿名メソッドで書いた場合
        subject.Update += delegate(Subject sender, object a, object b, object c, object d, object e) { DoSomething(sender); };

        // ラムダ式で書いた場合
        subject.Update += (sender, a, b, c, d, e) => DoSomething(sender);
    }
}

ラムダ式の方では、型名の記述その他が省略できてシンプルな記述になっている。

ラムダ式より匿名メソッドの方がよりシンプルな書き方になる例

ところが、内部で引数を使わないような下の例ではどうだろう。

using System;

class Subject
{
    public event Action<Subject, object, object, object, object, object> Update;
}

class Program
{
    static void DoSomething()
    {}

    static void Main()
    {
        var subject = new Subject();

        // 匿名メソッドで書いた場合
        subject.Update += delegate { DoSomething(); };

        // ラムダ式で書いた場合
        subject.Update += (_, a, b, c, d, e) => DoSomething();
    }
}

匿名メソッドの方が、ちょっとだけシンプルになっている気がしないだろうか。

■ 本日のまとめ

とは云え、これは上で述べているように極端で、そして余り意味のない例だ。

こんなに引数が多いデリゲートなど殆ど必要ないだろう。

矢張り、「一般的には、ラムダ式を使うことで書き方もシンプルになることだし、匿名メソッドは使わずにラムダ式で書くようにした方が良いだろう。」と云って問題ないと思う。