1.如何使用delegate,定义一个委托类型的DEL委托,使其可以接收一个传递string的method。
public delegate void Del(string message);
// Create a method for a delegate.
public static void DelegateMethod(string message){
Console.WriteLine(message);
}
// Instantiate the delegate.Del
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
应用场景:在一个A类中定义一个委托,然后再在被调用的A类中定义事件,最后在调用的B类中订阅A类中的事件。在使用的是时候,只需要声明A类即可。
示例代码:https://github.com/Fdslk/myCoreApp/tree/master/TestDelegate
2.使用delegate进行synchronous callback,将委托作为一个参数传入
public static void MethodWithCallback(int param1, int param2, Del callback)
{
callback("The number is: " + (param1 + param2).ToString());
}
3.委托多个method,将委托进行加操作,最后对其进行invoke操作,会按照顺序执行委托方法
allMethodsDelegate.Invoke("aaa-----");
4.delegate func (must include one output definition):主要好处就是不用定一个委托,而是直接声明func就可以直接使用;Func is a generic delegate included in the System namespace. It has zero or more input parameters and one out parameter. The last parameter is considered as an out parameter.
1)用来组装lambda expression Func<string, string> selector = str => str.ToUpper();声明之后再在lambda expression中直接使用该func
2)声明Anonymous method Func<string, string> convert = delegate(string s) { return s.ToUpper();};
这么写的好处?
5.delegate action (Encapsulates a method that has no parameters and does not return a value.)
1) instantiating the Action delegate
2) Action delegate with anonymous methods
3) lambda expression to an Action delegate instance
6.event 是基于delegate的一种衍生的对象,通常需要event先去publish一个notification,然后订阅者订阅该信息,即可在event发布notification的时候consume。
1)应用场景:触发一个event,通常需要一个action的trigger,一般都是基于的用户的交互,button的click事件,组件的属性改变的时候。该事件被触发的这个过程可以被称为一个event sender。
2)how to implement event
1> define event provider
2> define eventArgs model(event data,The EventHandler delegate includes the EventArgs class as a parameter.)
3> define event handler(签名和event中的handler delegate保持一致)
写之前,我先说自己一个SB的地方,dotnet core console输入的地方,不能在dotnet的输入框中,需要在terminal中以dotnet run的形式跑起来,否则会报出一下的错误
解决方法:用rider debug,或者一下方法
实现方法一:不需要传递数据,只需要在满足某个条件的时候执行某些事件。以一个累加为例,从console中输入数据,当数据输入的次数大于threshold的时候,触发委托的事件。参考代码:https://github.com/Fdslk/myCoreApp/commit/9d909a0f62788c8ae81e5bc783b87a0d756aaaf4#diff-40929d8b453e589975c232c626d204f8d4b51223d3d851c7b66c3e66b61471c7
实现方法二:构建一个能够传递参数的委托event,定义一个带有抽象参数的event handler public event EventHandler<ThresholdReachedEventArgs> ThresholdReached, ThresholdReachedEventArgs inherit from EventArgs。参考代码:https://github.com/Fdslk/myCoreApp/commit/92ac854d640bca89ee3e59a67dc57168c95aa144
实现方式三:使用委托来实现event,定义一个能够接受参数的delegate, public delegate void ThresholdReachedHandlerEvent(Object sender, ThresholdReachedEventArgs e);,再在实现类中定义一个上述委托声明的event,实现event触发的实践和上图一致,参考代码:https://github.com/Fdslk/myCoreApp/commit/6368d89069cc6c2f757ceaaa589f68dde37c51fe