委托定义类型,类型指定特定方法签名。 可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。 以下示例演示了委托的用法。 using System; using System.Linq; public class Program { public delegate string Reverse(string s); static string ReverseString(string s) { return new string(s.Reverse().ToArray()); } static void Main(string[] args) { Reverse rev = ReverseString; Console.WriteLine(rev("a string")); } }
为简化开发过程,.NET 包含一组委托类型,程序员可重用这些类型而无需创建新类型。 其中包括
现在可使用 using System; using System.Linq; public class Program { static string ReverseString(string s) { return new string(s.Reverse().ToArray()); } static void Main(string[] args) { Func<string, string> rev = ReverseString; Console.WriteLine(rev("a string")); } } 对于此简单示例而言,在 例如,要进行切换并使用匿名委托筛选出只有偶数的列表,然后将其打印到控制台。 using System; using System.Collections.Generic; public class Program { public static void Main(string[] args) { List<int> list = new List<int>(); for (int i = 1; i <= 100; i++) { list.Add(i); } List<int> result = list.FindAll( delegate (int no) { return (no % 2 == 0); } ); foreach (var item in result) { Console.WriteLine(item); } } } 如你所见,该委托的正文只是一组表达式,其他所有委托也是如此。 但它并非单独定义,而是在调用List<T>.FindAll 方法时临时引入。 但是,即使使用此方法,仍有许多可以丢弃的代码。 此时就需要使用 lambda 表达式。 lambda 表达式(或简称“lambda”)在 C# 3.0 中作为语言集成查询的 (LINQ) 核心构建基块被首次引入。 这种表达式只是使用委托的更方便的语法。 它们将声明签名和方法正文,但在分配到委托之前没有自己的正式标识。 与委托不同,可将其作为事件注册的左侧内容或在各种 LINQ 子句和方法中直接分配。 由于 lambda 表达式只是指定委托的另一种方式,因此应可重新编写上述示例,令其使用 lambda 表达式而不是匿名委托。 using System; using System.Collections.Generic; public class Program { public static void Main(string[] args) { List<int> list = new List<int>(); for (int i = 1; i <= 100; i++) { list.Add(i); } List<int> result = list.FindAll(i => i % 2 == 0); foreach (var item in result) { Console.WriteLine(item); } } } 在前面的示例中,所使用的 Lambda 表达式为 再次强调,lambda 只是委托,这意味着可将其顺利用作事件处理程序,如以下代码片段所示。 public MainWindow() { InitializeComponent(); Loaded += (o, e) => { this.Title = "Loaded"; }; } 此上下文中的 |
|