C# 2.0 이전 버전에서는 대리자를 선언하는 유일한 방법은 명명된 메서드를 사용하는 것이었습니다. C# 2.0에는 무명 메서드(대리자)가 도입되었으며 C# 3.0 이상에서는 인라인 코드를 작성하는 기본 방법으로 람다 식이 익명 메서드를 대체했습니다.
익명 대리자(메서드) :
익명 대리자라는 이름은 좀 더 정확하게는 익명 메소드라고 불러야 할 것 같습니다. (간단히 말하면 둘 다 같은 뜻입니다. 물건). 이전에 Delegate Type에서 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("实名"); //调用命名方法 } } }
결과:
익명의 매개변수 범위 method는 "익명 메서드 블록"입니다.
대상이 블록 외부에 있는 경우 익명 메소드 블록 내부에서 점프 문(예: goto, break 또는 continue)을 사용하는 것은 오류입니다. 대상이 블록 내부에 있는 경우 무명 메서드 블록 외부에서 점프 문(예: goto, break 또는 continue)을 사용하는 것도 오류입니다.
Func
예전에는 Delegate Delegate를 사용할 때에는 Delegate 클래스를 미리 선언한 후 등록해야 했습니다.
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 } } }
조건에 따라 프로그램에서 대리자 클래스를 선언할 수 없지만 대리자를 사용해야 하는 경우 어떻게 해야 합니까? 이 시점에서 Func 대리자 사용을 고려할 수 있습니다. Func
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 } } }
비교해 보면 둘의 결과는 동일하지만 Func는 Delegate보다 훨씬 간단하지만 Delegate는 익명 메서드를 로드할 수 있습니다. 예를 들어 위의 예에서는 익명 메서드를 사용합니다. 🎜>
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 } } }
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 } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //lambda 表达式 Func<string, string> change = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper(); Console.WriteLine(change(str)); //结果 ABC } } }
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"; //lambda 表达式 MyDelegate my = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper(); Console.WriteLine(my(str)); //结果 ABC } } }