C#入门教程:深入解析委托delegate与事件

5 下载量 146 浏览量 更新于2024-08-30 收藏 82KB PDF 举报
English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } } 这样,通过传入不同的Language枚举值,GreetPeople就能根据需求调用对应的问候方法。但这种做法存在一个问题,如果我们要增加更多语言的问候,就需要不断修改GreetPeople方法,这显然违背了开闭原则——对扩展开放,对修改关闭。 1.1.2 委托的引入 为了解决上述问题,C#引入了委托(Delegate)的概念。委托可以被看作是方法的引用,它允许我们将一个或多个方法的引用赋值给一个变量。这样一来,GreetPeople方法就可以接收一个委托类型作为参数,而不是直接接收一个语言枚举。首先,我们需要定义一个委托类型: public delegate void GreetingDelegate(string name); 现在,我们可以创建GreetingDelegate类型的实例,并将其指向不同的问候方法: GreetingDelegate greet = new GreetingDelegate(EnglishGreeting); greet += ChineseGreeting; 这样,greet变量就包含了两个方法的引用。然后在GreetPeople方法中,我们可以直接通过greet调用这些方法: public void GreetPeople(string name, GreetingDelegate greet) { greet(name); } 这样,GreetPeople就不再需要知道具体使用哪个语言的问候,只需传递对应的委托即可。如果需要添加新的语言,只需要新增一个方法并将其添加到委托实例即可,无需修改GreetPeople。 1.2 委托与多播 在上面的例子中,我们看到一个委托可以引用多个方法,这就是所谓的多播委托。这意味着当调用委托时,它会依次执行所有已附加的方法。这种特性使得委托成为实现事件处理的核心机制。 1.3 委托与匿名方法 C#还允许我们使用匿名方法直接在创建委托实例时指定要执行的代码块,这在某些情况下可以简化代码: GreetingDelegate greet = delegate(string name) { Console.WriteLine("Hello, " + name); }; 1.4 Lambda表达式与委托 从C# 3.0开始,lambda表达式提供了更简洁的方式来创建委托实例: GreetingDelegate greet = (name) => Console.WriteLine("Hello, " + name); 1.5 事件(Event) 事件是委托的一种特殊用法,通常用于实现发布/订阅模式。一个类(发布者)可以声明一个事件,其他类(订阅者)可以通过订阅该事件来响应特定情况的发生。事件通常通过关键字event修饰,防止外部代码直接访问,确保安全性。 1.6 异步编程与委托 委托在异步编程中起着关键作用。A