【C#】ワンライナーで書ける式形式メンバー

式形式メンバー

まずは下記のコードをご覧ください。

public static bool IsNullOrEmpty(this string text)
{
    return string.IsNullOrEmpty(text);
}

上記は【C#】拡張メソッドという記事で例示した、string.IsNullOrEmpty()を扱いやすくした拡張メソッドです。

var text = "";

// これが
Cnosole.Write(string.IsNullOrEmpty(text));

// こう書ける
Console.Write(text.IsNullOrEmpty());

という方法を実現する拡張メソッドですね。

このコード、string.IsNullOrEmpty()returnしているだけなのに{}で括ってあげるのがなんか嫌じゃないですか?

だって、foreachifも、続く処理が単文(単一ステートメント)であれば{}は不要ですよね。

// これは
foreach (var n in Enumerable.Range(1, 20))
{
    Console.Write(n);
}

// こう書ける
foreach (var n in Enumerable.Range(1, 20))
    Console.Write(n);

// これは
if ((n == 3) || ($"{n}".Contains(3)))
{
    Console.Write("アホ");
}

// こう書ける
if ((n == 3) || ($"{n}".Contains(3)))
    Console.Write("アホ");

組み合わせて

// これを
foreach (var n in Enumerable.Range(1, 20))
{
    if ((n == 3) || ($"{n}".Contains(3)))
    {
        Console.Write("アホ");
    }
}

// こう書ける
foreach (var n in Enumerable.Range(1, 20))
    if ((n == 3) || ($"{n}".Contains(3)))
        Console.Write("アホ");

こうも書ける訳です。余計な{}がなくてスッキリしていますよね。特に先人の残したネスト地獄のコードを読んでいると、{}なんて見るのも嫌じゃないですか。

だから、メソッドでも{}なしで書きたいですよね?ですよね?

メソッドも、{}を省略して書けるケースがあります。

// これは
public static bool IsNullOrEmpty(this string text)
{
    return string.IsNullOrEmpty(text);
}

// こう書ける
public static bool IsNullOrEmpty(this string text) => string.IsNullOrEmpty(text);

どうでしょうか?{}が減っただけですが、かなりスッキリしましたよね。

こういう記法ができる式形式メンバーはC#6.0で実装され、C#7.0で拡張されました。

条件

式形式メンバーは、単一ステートメントで記載されているメソッドやプロパティに使用できます。

なので、たとえば以下のようなメソッドは、式形式メンバーは使用できません。

// アホ毛・パーカー・ショートヘア・ニーソのいずれか2つ以上を満たせばボーイッシュとする
public static bool IsBoyish(this GirlModel girl)
{
    var boyishibility = 0;

    // アホ毛か
    if (girl.HasAhoge)
        boyishibility++;

    // パーカーか
    if (girl.IsWearingHoodie)
        boyishibility++;

    // ショートヘアか
    if (girl.HasShortHair)
        boyishibility++;

    // ニーソか
    if (girl.IsWearingKneeSocks)
        boyishibility++;

    // 判定
    return (boyishibility >= 2);
}

ですが、たとえばボーイッシュがより広く浸透した世界で、アホ毛・パーカー・ショートヘア・ニーソのいずれか一つでも満たせばボーイッシュといえるようになった場合は、下記のように書けます。

public static bool IsBoyish(this GirlModel girl) => (girl.HasAhoge || girl.IsWearingHoodie || girl.HasShortHair || girl.IsWearingKneeSocks);

ちなみにアホ毛・パーカー・ショートヘア・ニーソは私のHN「あぱしょに」の名前の由来です(小声)

書き方

書き方は、{}の代わりに=>を使用して、returnを省略するという記法になります。

// これは×
// returnは書かない
public static bool IsNullOrEmpty(this string text) => return string.IsNullOrEmpty(text);

この記法は、続くステートメントをreturnしますよ、ということをコンパイラに通知しているんですね。なので明示的にreturnは書けません。

{}を省略できると書きましたがどちらかというと副産物的なメリットで、本来はreturnを省略するための記法ということになります。

戻り値を返さないメソッドにも使える

戻り値を返さないメソッドに対しても、単一ステートメントのメソッドであれば式形式メンバーを使用できます。

// これは
public static void WriteToConsole(this object logMessage)
{
    Console.Write(logMessage);
}

// こう書ける
public static void WriteToConsole(this object logMessage) => Console.Write(logMessage);

これらのメソッドはもともと、ふつうはreturnを省略するかと思いますが式形式メンバーでも同様にreturnは書きません。

式形式メンバーは便利か

個人的には、使えるところでは積極的に使っています。タイプ量が減るのも良いですが、ワンライナーで書けるのがやっぱり楽です。慣れてしまえば読む時でもメリットがあると思います。

ただし、実際の処理が改行&インデントされていれば、それはそれで読みやすいということもあると思います。その辺りは個人の感覚によりけりですが、こういう記法があるということを知っているだけでも訳に立つと思います。

参考

C# の歴史
式形式のメンバー (C# プログラミング ガイド)