static void Main(string[] args) { CountIt count = () => Console.WriteLine("I am in Lambda Expression"); count(); MyDel d1 = (int x) => x + x; int y = d1(4); Console.WriteLine("y = " + y); d1 = z => z * z; int k = d1(3); Console.WriteLine(" k = " + k); MyDel2 d2 = (x, h) => { Console.WriteLine("x = " + x + " h= " + h); return(x + h); }; int g = d2(1, 2); Console.WriteLine("g =" + g); }
private void button6_Click(object sender, EventArgs e) { MyClass mc = new MyClass(); MyDel2 mDel = mc.Add2; //创建并初始化委托 mDel += mc.Add3; //添加方法 mDel += mc.Add2; //添加方法 Console.WriteLine("Value:{0}", mDel()); }
static void Main() { int a = 29846; int[] arr = { 83, 26, 48, 72, 56, 92, 65, 82, 56, 19 }; MyDel1 d1 = GetDigits; MyDel2 d2 = PrintArray; d2(d1(a)); d2(arr); Console.WriteLine(); Console.WriteLine(d1.Method); Console.WriteLine(d1.Target); Console.WriteLine(d2.Method); Console.WriteLine(d2.Target); }
static void Main(string[] args) { MyDel del = new MyDel(F1); Console.WriteLine(del(10)); MyDel2 del2 = new MyDel2(F2); del2("美国", "德国"); Mydel3 mydel3 = new Mydel3(F3); Mydel3 mydel4 = F3;//等价于Mydel3 mydel4 = new Mydel3(F3); string s = mydel4(); Console.WriteLine(s); Console.ReadKey(); }
static void Main(string[] args) { MyClass myClass = new MyClass(); MyTeam myTeam = new MyTeam(); MyDel1 myDel1 = myClass.AddNumber; MyDel2 myDel2 = MyClass.Print; myDel2 += myClass.Add; myDel2 += MyClass.Print; myDel1(20); myDel2(); myDel1(20); myDel2(); myDel1 += myTeam.AddNumber; myDel2 += myTeam.Add; myDel2 += myTeam.Print; Console.WriteLine(); myDel1(20); myDel2(); myDel1(20); myDel2(); //lambda MyDel3 myDel3 = (x) => { myTeam.TeamCount += x; Console.WriteLine(myTeam.TeamCount); return(myTeam.TeamCount); }; Console.WriteLine($"myDel3 : {myDel3(1000)}"); }
static void Main(string[] args) { // 前提:1、委托对象 2、委托对象的调用列表有且只有一个方法(以下就称为 引用方法) 就可以采用异步调用来执行这个引用方法 // BeginInvoke:异步方法 // BeginInvoke : 1、从线程池获取一个线程,用来执行引用方法 // 2、参数列表的组成: 1、引用方法需要的参数 // 2、两个额外的参数-----callback参数和state参数 --回调模式中解释 // 3、返回一个实现 IAsyncResult 接口的对象的引用,这个引用在内部实际是 AsyncResult 类的对象的引用。这个引用包含了异步方法的当前状态和信息。 // 4、调用 BeginInvoke 方法,BeginInvoke 立即返回,调用线程继续执行之后的程序 // EndInvoke : 1、通过 IAsyncResult 接口的引用,找到 异步方法 相关联的线程 // 2、当调用 EndInvoke 时,若新线程中的引用方法 已经执行完毕:1、清理线程并释放线程资源(所以有BeginInvoke,就必须有EndInvoke) // 2、将引用方法的返回值 设置为 EndInvoke 方法的返回值 // 3、当调用 EndInvoke 时,若新线程中的引用方法 还未执行完毕:1、调用 EndInvoke 方法的线程会停止并等待 (这样虽然也会阻塞线程,但是比直接调用委托要提早执行后面的步骤)就跟async/await是一样的 // 2、等待结果,然后 清理并释放线程资源,设置返回值 // 4、 如果委托对应的引用方法出现异常,则在调用 EndInvoke 方法时,抛出异常,但是这个异常需要在引用方法中处理 // 模式1: 等待--直到完成模式 ( wait-until-done ) MyDel myDel1 = new MyDel(Sum); IAsyncResult iar1 = myDel1.BeginInvoke(1, 2, null, null); // 在此模式中,AsyncCallBack 和 objec 为null 就可以了 Console.WriteLine("主线程继续执行后面的程序"); Console.WriteLine("当需要异步方法中的结果时,调用EndInvoke"); long result1 = myDel1.EndInvoke(iar1); // 等待 引用方法 完成 Console.WriteLine("After EndInvoke result:{0} ", result1); // 模式2:轮询模式(polling) MyDel2 myDel2 = Sum2; IAsyncResult iar2 = myDel2.BeginInvoke(5, null, null); Console.WriteLine("主线程继续执行后面的程序"); while (!iar2.IsCompleted) { Console.WriteLine("Not Done"); } Console.WriteLine("完成引用方法"); string result2 = myDel2.EndInvoke(iar2); Console.WriteLine("Result:{0}", result2); // 模式3:回调模式(CallBack) // 解释参数 AsyncCallBack MyDel3 myDel3 = Sum3; myDel3.BeginInvoke(5, CallBack, null); // 由于使用了回调函数,所以这个就不需要对返回值进行处理 Console.WriteLine("主线程继续执行后面的程序"); // 解释参数 object:这个参数实际上是预留的,可以传输我们想要传入回调方法的参数 // 1、一般的对象 string strobj = "1111"; myDel3.BeginInvoke(5, CallBack2, strobj); //2、当没有什么需要传入的参数时,可以将委托对象传入,这样回调可以方便一些 myDel3.BeginInvoke(5, CallBack3, myDel3); // 实际应用时的特殊 ref MyDelRef myDelRef = Add; myDelRef.BeginInvoke(ref refX, RefCallBack, null); MyDelOut myDelOut = Out; myDelOut.BeginInvoke(out outY, OutCallBack, null); Console.Read(); }