LoginSignup
1
1

【C#】定義済みデリゲートとラムダ式を使用し、省略された1つの式を読み解く

Last updated at Posted at 2020-06-26

概要

C#初学者をさまよい続けるこの頃、なんとなくで書いていたコード「定義済みデリゲートとラムダ式を使用し、省略された1つの式」をようやく理解できたのでまとめました。

C#を学習し、以下の知識がある初学者向けの記事になります。

  • 変数への代入
  • 明示的な変換(キャスト)
  • ラムダ式
  • デリゲート(定義済みデリゲート)

定義済みデリゲートとラムダ式を使用し、省略された1つの式とは

下記のようなコードを想定しています。

public void DelegateSample()
{
            var result = ((Func<int, int, int, string>)((salePrice, amount, costPrice) =>
            {
                var totalSalePrice = salePrice * amount; // 売価*数量 = 売上高
                var totalCostPrice = costPrice * amount; // 原価*数量 = 合計原価
                return $"粗利は ({totalSalePrice} - {totalCostPrice} = {totalSalePrice - totalCostPrice}) で求めることができます。";
            }))(1500, 5, 1000);
            Console.WriteLine(result);

            var result2 = ((Func<DateTime, string>)(today =>
            {
                var lastweek = today.AddDays(-7);
                return $"{today.ToShortDateString()}から一週間前の日時は{lastweek.ToShortDateString()}です。";
            }))(DateTime.Today);
            Console.WriteLine(result2);
}
粗利は (7500 - 5000 = 2500) で求めることができます。
2024/04/14から一週間前の日時は2024/04/07です。

解説

実行すると現在時刻がコンソールに表示される簡単なコードです。

public void DelegateCast1()
{
            var result = ((Func<string>)(() =>
            {
                var date = DateTime.Now.ToShortDateString(); // 日付
                var dayOfWeek = DateTime.Now.DayOfWeek; // 曜日
                return $"現在時刻は {date} ({dayOfWeek})です。";
            }))();

            Console.WriteLine(result);
}
現在時刻は 2024/04/14 (Sunday)です。

上記のコードを分解する 

public void DelegateCast2()
{
            // ラムダ式をFunc<string>に変換する。
            var func = () =>
            {
                var date = DateTime.Now.ToShortDateString(); // 日付
                var dayOfWeek = DateTime.Now.DayOfWeek; // 曜日
                return $"現在時刻は {date} ({dayOfWeek})です。";
            };

            var result = func();
            Console.WriteLine(result);
}

ポイント1funcの型はFunc<string>である。
image.png
右辺のラムダ式がFunc<string>としてキャストされていることがわかります。

ポイント2resultの型はstring型である。
image.png
デリゲートはメソッドと同じようにxxx();で実行されます。resultにはfunc()実行結果 である文字列がセットされています。

元の式はすべて一行にまとまっていたため、難しくみえたキャストと実行ですが、分解して変数の型を確認することでわかりやすくなりました。

まとめ

この式はキャスト後のデリゲートを実行し、resultに結果をセットしている式である。
image.png

  • 左辺: result デリゲートの実行結果
  • 右辺: ( (Func<string>)キャスト(()=>{省略}) ) ();デリゲートを実行

この記事はQiita初投稿記事となります。
2024.04 追記しました。最後まで見ていただきありがとうございました。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1