多播委托

委托可以被设计为多播的,这意味着一个委托可以调用多个方法。当调用多播委托时,所有关联的方法都会按顺序执行。这可以通过多次使用+=运算符来实现:

myDelegate += AnotherMethod;
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

委托的异步调用

C#中的委托还支持异步调用,这可以通过BeginInvoke和EndInvoke方法实现。异步调用允许在不阻塞当前线程的情况下执行委托。

委托与匿名方法、Lambda表达式

C#还允许使用匿名方法和Lambda表达式来定义委托,这使得代码更加简洁和易于理解。例如:

MyDelegate myDelegate = delegate(int x) { Console.WriteLine(x); };
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

或使用Lambda表达式:

MyDelegate myDelegate = (int x) => Console.WriteLine(x);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

总结

委托在C#中提供了一种灵活的方法引用机制,它允许你将方法作为参数传递,实现方法的延迟调用,以及支持多播和异步调用,是C#中一个非常强大的特性。

C#事件

在C#中,事件(Event)是一种特殊的委托类型,用于实现发布-订阅模式(Publish-Subscribe Pattern),也称为观察者模式。事件允许一个类(发布者)通知其他类(订阅者)某些事情已经发生,而无需发布者直接与订阅者交互。这提供了高度的解耦和灵活性。

事件的基本构成

事件由两部分组成:

  1. 事件声明:在类中声明事件,通常使用关键字event和一个委托类型。
  2. 事件处理器:处理事件的代码,通常是一个方法,其签名与事件委托的签名相匹配。

使用事件的步骤

1. 定义委托类型

首先,定义一个委托类型,它将作为事件的类型。例如:

public delegate void MyEventHandler(object sender, EventArgs e);
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
2. 声明事件

在类中声明事件,使用event关键字和前面定义的委托类型:

public event MyEventHandler MyEvent;
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
3. 触发事件

在类中,当某个条件满足时,通过调用+=-=操作符的隐式调用的Invoke方法来触发事件:

public void OnMyEvent()
{
    MyEvent?.Invoke(this, EventArgs.Empty);
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
4. 订阅事件

在其他类中,可以订阅事件,即向事件添加事件处理器:

public void SubscribeToEvent()
{
    PublisherClass publisher = new PublisherClass();
    publisher.MyEvent += OnMyEventReceived;
}

private void OnMyEventReceived(object sender, EventArgs e)
{
    Console.WriteLine("Event received!");
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
5. 取消订阅事件

同样在订阅者类中,可以取消订阅事件:

public void UnsubscribeFromEvent()
{
    PublisherClass publisher = new PublisherClass();
    publisher.MyEvent -= OnMyEventReceived;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意事项

通过使用事件,C#程序可以实现更复杂的交互和解耦的组件设计。

C# 委托与事件的区别

在C#中,委托(Delegate)是一种引用类型的数据类型,它允许你封装一个方法的引用,从而可以在稍后的某个时间调用这个方法。委托可以看作是一种“可传递的函数”,能够将函数作为参数传递给其他函数,或者将函数赋给变量。委托在C#中用于定义回调方法,是实现事件和多线程的基础。

事件(Event)是基于委托的一种封装,它提供了一种多对一的机制,即多个订阅者可以订阅同一个事件,当事件被触发时,所有订阅者都会被通知。事件是C#中封装和隐藏委托的一种方式,它通常用于组件之间或者类之间的通信。事件的声明通常在类的内部,而事件的订阅和触发则发生在类的外部。

事件和委托的关系可以这样理解:

  1. 事件是委托的封装:事件在内部使用委托来存储和调用方法,但对外部提供了更安全和封装的接口。
  2. 事件是多播的:一个事件可以绑定多个委托,这意味着当事件被触发时,所有绑定的方法都会被调用。
  3. 事件的访问限制:事件通常被声明为public或protected,而其对应的委托类型可以是private的,这样可以控制事件的触发点,但允许外部代码订阅事件。
  4. 事件的触发:事件的触发通常通过类的内部代码完成,而委托可以直接由外部代码调用。

简单来说,委托是C#中实现方法引用和传递的基础,而事件是基于委托的一种高级特性,用于实现对象之间的解耦和通信。

>>
注:本文转载自blog.csdn.net的上杉翔二的文章"http://blog.csdn.net/qq_39388410/article/details/78305815"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!