2.0 より前のバージョンの C# では、デリゲートを宣言する唯一の方法は、名前付きメソッドを使用することでした。 C# 2.0 では匿名メソッド (デリゲート) が導入され、C# 3.0 以降では、インライン コードを記述するための推奨方法として匿名メソッドに代わってラムダ式が使用されました。
匿名デリゲート (メソッド):
匿名デリゲートの名前は正確ではありません。正確には匿名メソッドと呼ぶべきです (要するに、この 2 つは同じ意味です)。以前「デリゲートの種類」で、デリゲートは同じラベルを持つメソッドを参照するために使用されると述べました。つまり、デリゲート オブジェクトを使用して、デリゲートによって参照できるメソッドを呼び出すことができます (パラメーターはメソッド名です)。一方、匿名メソッドはコードのブロックをデリゲート パラメーターとして受け取ります (パラメーターは関数を実装するコードです)。匿名メソッドを使用すると、デリゲートをインスタンス化するために必要なコーディングのオーバーヘッドが削減されます。別のメソッドを作成します。
匿名メソッドの編集:
匿名メソッドは、デリゲート内に直接マウントされるコード ブロックであるか、デリゲート インスタンスを作成するために delegate キーワードを使用して宣言する必要があります。
delegate void MyDelegate(int i); //デリゲートを宣言
MyDelegate my = delegate(int i){/* コードブロック*/} //デリゲートインスタンスを作成して匿名メソッドを実装する
匿名メソッドインスタンス:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { //声明一个委托 delegate void MyDelegate(string str); //定义一个实名方法 public static void fun(string str) { Console.WriteLine("这是一个 {0} 方法", str); } static void Main(string[] args) { //创建一个委托实例,里面包含一个匿名方法 MyDelegate examp1 = delegate(string name) { Console.WriteLine("这是一个 {0} 方法",name); //代码块 }; examp1("匿名"); //调用匿名方法 MyDelegate examp2 = new MyDelegate(fun); //在委托中实名注册一个fun命名方法 examp2("实名"); //调用命名方法 } } }
結果:
匿名メソッドのパラメータのスコープは「匿名メソッドブロック」です。
ターゲットがブロックの外にある場合、匿名メソッド ブロック内でジャンプ ステートメント (goto、break、または continue など) を使用するとエラーになります。ターゲットがブロック内にある場合、匿名メソッド ブロックの外でジャンプ ステートメント (goto、break、または continue など) を使用することもエラーになります。
Func
以前は、デリゲート デリゲートを使用する場合、次のように事前にデリゲート クラスを宣言してから、メソッドをデリゲートに登録する必要がありました。条件により、プログラムのデリゲート クラスで宣言することはできませんでしたが、デリゲートを使用する必要があります。どうすればよいでしょうか? この時点で、Func デリゲートの使用を検討できます。 Func
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明委托 public static string Toup(string str) //定义方法 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; MyDelegate my = Toup; //注册方法 Console.WriteLine(my(str));//调用方法 结果 ABC } } }
比較すると、2 つの結果は同じですが、Func は Delegate よりもはるかに単純ですが、Delegate は匿名メソッドを読み込むことができます。たとえば、上記の例では匿名メソッドを使用しています:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { public static string Toup(string str) //定义方法 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; Func<string, string> change = Toup; //泛型委托 Console.WriteLine(change(str));//调用方法 结果 ABC } } }
Can Func。仕事もしますか? Func は匿名メソッドを作成することもでき、次のように宣言する必要はありません:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明委托 static void Main(string[] args) { string str = "abc"; //创建匿名方法 MyDelegate my = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(my(str)); //结果 ABC } } }
上記の匿名メソッドと比較すると、匿名メソッドを作成するときはどちらもデリゲートを介して実装されることがわかります (デリゲートは引き続き使用されます)。デリゲートを使用しませんか? 使用しなくても大丈夫です
ラムダ式:
ラムダ式は、デリゲートまたは式ツリー型を作成するために使用できる匿名メソッドです。ラムダ式を使用すると、引数として渡したり、関数呼び出しの値として返したりできるローカル関数を作成できます。 Lambda 式を作成するには、Lambda 演算子 => の左側に入力パラメータ (存在する場合) を指定し、反対側に式またはステートメントのブロックを入力します。たとえば、ラムダ式 x => x * x は、 x という名前の引数を指定し、 x の 2 乗を返します。
したがって、上記の例では、ラムダ式を使用して匿名メソッドを作成し、次のように変更します。using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //创建匿名方法 Func<string, string> change = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(change(str)); //结果 ABC } } }