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


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

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

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


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

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

```C#:
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です。
```

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

```C#:例
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)です。
```

### 上記のコードを分解する　

```C#:
public void DelegateCast2()
{
            // ()=> return string は Func<string> にキャストできる。
            var func = () =>
            {
                var date = DateTime.Now.ToShortDateString(); // 日付
                var dayOfWeek = DateTime.Now.DayOfWeek; // 曜日
                return $"現在時刻は {date} ({dayOfWeek})です。";
            };

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

**ポイント1**：`func`の型は`Func<string>`である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566811/4e53173a-f94e-a6ed-a5e4-e75db6fe21af.png)
右辺のラムダ式が`Func<string>`としてキャストされていることがわかります。

**ポイント2**：`result`の型は**string型**である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566811/614e3785-93ca-638c-1b5a-7a152c022dc8.png)
デリゲートはメソッドと同じように`xxx();`で実行されます。`result`には`func()`の**実行結果** である文字列がセットされています。

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

## まとめ
この式は**キャスト後のデリゲートを実行**し、`result`に結果をセットしている式である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566811/74a18cb6-2bef-23ae-052b-ac863758e68f.png)
- 左辺： `result` デリゲートの実行結果
- 右辺： `(` `(Func<string>)` ◀ <font color="BlueViolet">**キャスト**</font> ▶ `(()=>{省略})` `)` `();` ◀ <font color="RoyalBlue">**デリゲートを実行**</font>

記事内のソースコード

https://sharplab.io/#v2:C4LgTgrgdgNAJiA1AHwAICYCMBYAUKgZgAIMiBhPAbzyNpMwDYSAWIgWQEMBLKAClUwAGANoBdIhzABzAM4BKIjTrVcdNWoBukojI4BbAA4AbAKZEAvESgmA7kQDK+4yd5yA3EvVrdh0wDoAERNTKQ5gE0dfF3dPL1ofZ0Dgk1Dwsg4ZYExXD1U4ugT/IJCwk3TM9BzYgF88Wtw8QhJ0BydTFTVYptRWYpTSyOdXWI64rTAiMBMZCCNgCyJefgBWAB4eYBgiDa2d+kEAPjkl3VMABTAuAGMTLf0Ae2hNoiv7zIvrkwVzA9i1UfytHGRGA92AHCMjnOlxuC1OJg+sIAVBI9I8oMA3EQAPTYoiAJ41AIXySMADqaAecSFvjAFBygA2sv5jbSg8FGMhvYCIsyWV7vGFmFEPJ5Y3FEQD5ysTyQtABAqgAgosX0ryoADsRAAJAAiQDpPoBKJUA9gyLShMiFQhG86pEAC0RANYIhrJ5nzNlmtzONHItIJtLLZHOqCkA5gyAIRtAIEMgGiGQDKDIALBkAMgx+wCyDIA/BkAmgyAIAY1bl8r7jphloJBFtllshLmYg08grMABOXhTGZzEvyojAmuzYAtSxLVBrAKlAAqXD0t32R14oLgHAAnhZfmX1ADAcCjBlgDYTCYANYLUcTvwAQTgcG745kvHNipLgLoStVautY/Hfh793swEuUCkvDV46/4+xbDY2P3NU5GqQBpBkASIZAAA5QBGBMAZNTAFklQA7BkAU9NACEzHVKEXTIV3XB8nxfHh30/b9f3/QDgL9FMAB0wEoqA0wbTNeG7cI+wHXC73rGc1AEKtmzmdBzzoepOhnbpemSVIyiXbI5BGBsm2mFsFg7NYBEOY5XCnBs53yYEx3CBZmJMViTD8AA5e4bFw59X0I78fz/AC4CAtwhTxJDAA25BtNG0O8AHkADMAHVVw3SwjJM8zLMCCdApC9c3KIQAdsyQ7zL2VdVAD/nQAKdRQwBuJT1Sh9JMM1eCK2LgtC30KOTajaPorihLkY5OPyHjq0Uut0yE2IumIHoiD6STylbYYZx0uhhVcH4SGVNSiD1TtVjUg4iEAawZAFqGQBjhkAToZAAmGOMQ3k7QAugK5lO+ad8gmrw9NKQze37UyLKsx8bIIj97JIpyXJxdyvMa27fIq+KwsGx62JemLxzi0LEpStLaCvLLcoKq1itK8qYcq9dqpTBqM1yY6Jj4+ZLFOqAriqQH6F4zrgFauJhTgR4ACNTEAaPVABgGIQ/FzTB0AIQBYBijDZuaEIXNt2g7YyOmngVeKANBMMAZC4e4oGUjY5F5/nBe6i92vVElABIFEBKEV5XVfVqBqkAAAYOfNy2VbVjW/AAcRMYAe3HAxomqFyajwOogA===

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