C#デリゲート,匿名メソッド,Lambda,ジェネリックデリゲート,式ツリーコード例

C#デリゲート,匿名メソッド,Lambda,ジェネリックデリゲート,式ツリーコード例

一部の教材、ブログは委託と言うとイベントに言及しますが、イベントは委託の一例ですが、理解しやすくするために、今日は委託について話しません。

最后更新 2021/09/18 11:39
QueryWord
预计阅读 4 分钟
分类
.NET
标签
.NET C# 式木の木 ジェネリックデリゲート。 匿名の方法

最初の1分:委任

一部の教材、ブログは委託と言うとイベントに言及しますが、イベントは委託の一例ですが、理解しやすくするために、今日は委託について話しません。最初のコードの一部:

以下のコードは、委任アプリケーションのデモを完了します。1つの委任は3つのステップで行われる:

class Program
{
    //step01:首先用delegate定义一个委托 。
    public delegate int CalculatorAdd(int x, int y);

    static void Main(string[] args)
    {
        //step03:用这个方法来实例化这个委托。
        CalculatorAdd cAdd = new CalculatorAdd(Add);

        //int result = cAdd(5, 6);
        int result = cAdd.Invoke(5, 6);
    }

    // step02:声明一个方法来对应委托。
    public static int Add(int x, int y)
    {
        return x + y;
    }
}
  • step01:首先用delegate定义一个委托 。
  • ステップ2:デリゲートに対応するメソッドを宣言します。
  • ステップ03:このメソッドを使用して委任をインスタンス化します。

この時点で、委任が完了し、委任を呼び出すことができます。

2日目:匿名の方法

前の分で知っているように、委任アプリケーションを完了するには3つのステップがありますが、ステップが欠けている場合は、ステップが大きい卵に注意してください。しかし、マイクロソフトは卵を引っ張ることを恐れず、3つのステップを2つのステップにする必要があります!マイクロソフトは上記の3つのステップを簡素化するために匿名化を使用した。匿名の方法このアイテムは、C#では完全に必要なものですが、C#のケーキのためだけに、誰かがそれを文法砂糖と呼ばれる名前を与えるために考案しました。

class Program
{
    //step01:首先用delegate定义一个委托 。
    public delegate int CalculatorAdd(int x, int y);

    static void Main(string[] args)
    {
        //step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托
        CalculatorAdd cAdd = delegate (int x, int y) { return x + y; };

        int result = cAdd.Invoke(5, 6);
    }
}
  • ステップ01:Delegateでデリゲートを定義します。
  • step02 delegate int x int y { return x + y; }では、1つのメソッドをデリゲートに代入しますが、実はこの書き方は匿名メソッドです。

驚いたことに、これは2歩前の3歩ではない。

3分目:ラムダ式

原本很简单的程序,加上几个 delegate 关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。但是微软对 C#的设计理念是简单易用。微软就想方设法的来简化delegate(int x, int y) { return x + y; }这个匿名方法,Lambda 就出现了。下边我来看几种 lambda 表达式的写法:

class Program
{
    public delegate int CalculatorAdd(int x, int y);
    static void Main(string[] args)
    {
        //方法一:
        CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
        int result1 = cAdd1(5, 6);

        //方法二:
        CalculatorAdd cAdd2 = (x, y) => { return x + y; };
        int result2 = cAdd2(5, 6);

        //方法三:
        CalculatorAdd cAdd3 = (x, y) => x + y;
        int result3 = cAdd2(5, 6);
    }
}

4分目:ジェネラルデリゲート

NETバージョンのアップグレードでは、新しいバージョンは常に古いバージョンとは異なる必要があります。そうでなければ、マイクロソフトのエンジニアは上司にどのように違反しますか?マイクロソフトはまた新しいことをしています

class Program
{
    static void Main(string[] args)
    {
        //方法一:
        Func<int, int, int> cAdd1 = (int x, int y) => { return x + y; };
        int result1 = cAdd1(5, 6);

        //方法二:
        Func<int, int, int> cAdd2 = (x, y) => { return x + y; };
        int result2 = cAdd2(5, 6);

        //方法三:
        Func<int, int, int> cAdd3 = (x, y) => x + y;
        int result3 = cAdd2(5, 6);
    }
}

匿名メソッドであろうとラムダ式であろうと、デリゲートのアプリケーションを完了するには、デリゲートを定義するステップと、メソッドを使用してデリゲートをインスタンス化するステップの2つのステップがあります。マイクロソフトはこれら2つのステップを1つのステップにまとめ、Funcを使って委任の定義を簡素化した。

至此一个委托的应用就可用 Func<int, int, int> cAdd3 = (x, y) => x + y; 这样一句话来完成了,其中的 Func 就是所谓的泛型委托。

第5話:表現ツリー

式ツリーは実際にはデリゲートとは何の関係もありません。つまり、式ツリーはデリゲートを格納するコンテナです。もっと専門的に言うと、式ツリーはラムダ式にアクセスするためのデータ構造です。Lambda式を使用する場合は、式から直接取得すると、Compileが次のようなコードを直接使用できます。

class Program
{
    static void Main(string[] args)
    {
        Expression<Func<int, int, int>> exp = (x, y) => x + y;
        Func<int, int, int> fun = exp.Compile();
        int result = fun(2, 3);
    }
}
Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/04/22

バージョン別の. NETサポート状況(250 7 0 7更新)

仮想マシンとテストマシンを使用して、各バージョンのオペレーティングシステムの. NETサポートをテストします。オペレーティングシステムのインストール後、対応するランタイムを測定し、スターダストエージェントをパスとして実行できます。

继续阅读
同分类 / 同标签 2026/02/07

AOTの使用経験

プロジェクトの最初から、新しい機能が追加されたり、新しい構文が使用されたりするたびに、AOTリリーステストを行うという良い習慣を身につける必要があります。

继续阅读