C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.90425 の関連記事表示

<< 0 >>
■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
記事No.90412 のレス / END /過去ログ156より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -