■90425 |
Re[3]: 引数のあるメソッドをメソッドに渡す |
□投稿者/ 魔界の仮面弁士 -(2019/03/09(Sat) 22:26:39)
| ■No90412 (B.B さん) に返信 > しかしデリゲードはなかったことにしろという文言をよく見かけます
Delegate 型を無くしたらイベントすら扱えなくなりますよね。 delegate キーワードのことを言っているのでしょうか。
一応、解決済みマークはつけたままの状態にしておきますが、 前後の文脈が気になるので、具体的にどこに記載されていたのかを教えて欲しいです。
もしもそれが、 SimpleFunc f1 = i => i * 2; と書けるようになったので、C# 2.0 時代のような SimpleFunc f1 = delegate(int i) { return i * 2; }; の形式で記述する必要はもはや無くなった…という意味で 書かれているのだとしたら、それはその通りだと思います。
ただしラムダ式では、デリゲートと同じシグネチャが求められるので、 button1.Click += (sender, e) => { label1.Text += "x"; }; を、たとえ引数が不要だったとしても、 button1.Click += () => { label1.Text += "x"; }; // これは NG のように書くことはできないという制限があるのに対し、 delegate キーワードであれば、 button1.Click += delegate { label1.Text += "x"; }; のように、引数付きのデリゲートに引数無しの匿名関数を 割り当てることが可能という違いはあったりします。
> #90396で教えていただいた > isSuccessful = hogeMethod(() => Method3("ほげほげ")); > のようなラムダ式での記述の仕方を教えて欲しいのです
『() => Method3("ほげほげ")』の部分が「ラムダ式」ですね。
■No90417 (B.B さん) に返信 > delegate int SimpleFunc(int x); > この記述を書きたくないということでした。
えぇと…それはラムダ式とは関係ないです。(^_^: Func<,> はジェネリックなデリゲート型ですね。
ラムダ式とは C# 3.0 で追加された構文で、先の例で言えば 複数行ラムダ構文の (int i) => { i = i * 2; return i * 2; } や、あるいはより単純な単行ラムダ構文の i => i * 2; などの表記を指します。
ラムダ式を受け取る変数の型は、Delegate もしくは Expression に限られます。
static void Main() { // デリゲート型に対して、匿名メソッド式を代入 Func<int, int> x = delegate (int i) { return i * 2; };
// デリゲート型に対して、ラムダ式を代入 Func<int, int> y = i => i * 2;
// Expression 型に対して、ラムダ式を代入 Expression<Func<int, int>> z = i => i * 2;
// ローカル関数の宣言 int f1(int i) { return i * 2; }
// ローカル関数の宣言(式形式) int f2(int i) => i * 2; // これはラムダ式ではない }
ラムダ式は、デリゲートに対して代入すると匿名メソッド式として扱われ、 Expression 型の変数に代入した場合は式木 (expression tree) となるため、 ラムダ式を代入する変数を var z = (int i) => i * 2; のように型推論で宣言することはできません。
「=>」はラムダ演算子と呼ばれていましたが、C# 6.0 以降では ラムダ式だけでなく、式形式のメンバー定義にも使われるようになりました。 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-operator |
|