2020年10月30日
川俣晶の縁側ソフトウェアC# コーディング How To total 1077 count

【入門級】計算方法を引数にできるか?

Written By: 川俣 晶連絡先

足し算、引き算を引数にできるか? §

 値ではなく計算方法を引数にできるでしょうか?

 つまり、123や45を引数にするのではなく、足し算や引き算を引数にできるでしょうか?

 できます。

 それにはラムダ式という機能を使うと便利です。

 ラムダ式は、名前のないメソッドのようなもので、変数に代入したり、引数で渡したりすることができます。

 サンプルソースの(x, y) => x + yなどがラムダ式です。

 これには数式だけでなく、波括弧で囲って複雑なコードも書くことができます。 

 ラムダ式を入れることができる変数や引数の型は、デリゲート型ですが、通常はAction型またはFunc型を使います。戻り値がないときはAction型、あるときはFunc型です。ですから、整数を2つ受け取って整数を返す型はFunc<int,int,int>と型引数に3つのintが並びます。

罠の数々 §

  • Action型、Func型の変数/引数に代入できるのはラムダ式に限らない。引数や戻り値が一致すれば通常のメソッドも入る
  • ラムダ式が使われる前には匿名メソッドというものがあって、希にそれが残ったままのソースがある。注意しよう

参考リンク §

Func<T1,T2,TResult> デリゲート

=> 演算子 (C# リファレンス)

ラムダ式 (C# リファレンス)

 ラムダ式の書き方はいろいろある。知らない書き方でビックリしないように、様々なパターンを上記のリンクから把握しておこう。

リポジトリ §

https://github.com/autumn009/cshowto

Lambda §

using System;

class Program

{

    private static void sub(string label, Func<int, int, int> calc)

    {

        Console.WriteLine($"123と45の{label}の結果は{calc(123, 45)}です。");

    }

    static void Main()

    {

        sub("足し算", (x, y) => x + y);

        sub("引き算", (x, y) => x - y);

        sub("特殊条件計算", (x, y) =>

        {

            for (int i = 0; i < y; i++)

            {

                x += (int)(Math.Sin((double)i / (double)y) * 100);

            }

            return x;

        });

    }

}

実行結果

123と45の足し算の結果は168です。

123と45の引き算の結果は78です。

123と45の特殊条件計算の結果は2124です。

(最後の一つは意味のない計算を行っています)

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?