概要
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()
{
// ()=> 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>
である。
右辺のラムダ式がFunc<string>
としてキャストされていることがわかります。
ポイント2:result
の型はstring型である。
デリゲートはメソッドと同じようにxxx();
で実行されます。result
にはfunc()
の実行結果 である文字列がセットされています。
元の式はすべて一行にまとまっていたため、難しくみえたキャストと実行ですが、分解して変数の型を確認することでわかりやすくなりました。
まとめ
この式はキャスト後のデリゲートを実行し、result
に結果をセットしている式である。
- 左辺:
result
デリゲートの実行結果 - 右辺:
(
(Func<string>)
◀ キャスト ▶(()=>{省略})
)
();
◀ デリゲートを実行
記事内のソースコード
この記事はQiita初投稿記事となります。
2024.04 追記しました。最後まで見ていただきありがとうございました。