委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托

From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html

类是对象的抽象,而委托则可以看成是函数的抽象。一个委托代表了具有相同参数列表和返回值的所有函数。

[csharp] view plaincopy

  1. class Program
  2. {
  3. delegate int CalculateDelegate(int a, int b);
  4. int add(int a, int b)
  5. {
  6. return a + b;
  7. }
  8. static void Main(string[] args)
  9. {
  10. CalculateDelegate d = new Program().add;
  11. //CalculateDelegate d = new CalculateDelegate(new Program().add);
  12. Console.WriteLine(d(1, 2));
  13. Console.ReadKey();
  14. }
  15. }

委托作为参数,在C#中非常常见。比如线程的创建,需要给一个ThreadStart或者ParameterizedThreadStart委托作为参数,而在线程执行的时候,将这个参数所指代的函数用作线程执行体。再比如:List<T>类型的Find方法的参数也是一个委托,它把“怎么去查找”或者说“怎么样才算找到”这个问题留给了开发人员。这有点像模板模式。

委托作为返回值一般会用在“根据不同情况决定使用不同的委托”这样的情形下。这有点像工厂模式。

2. 异步调用

From: http://www.cnblogs.com/daxnet/archive/2008/11/10/1687013.html

异步通过委托来完成。.net使用delegate来"自动"生成的异步调用是使用了另外的线程(而且是线程池线程)。

[csharp] view plaincopy

  1. class Program
  2. {
  3. static TimeSpan Boil()
  4. {
  5. DateTime begin = DateTime.Now;
  6. Console.WriteLine("水壶:开始烧水...");
  7. Thread.Sleep(6000);
  8. Console.WriteLine("水壶:水已经烧开了!");
  9. return DateTime.Now - begin;
  10. }
  11. delegate TimeSpan BoilingDelegate();
  12. static void Main(string[] args)
  13. {
  14. Console.WriteLine("小文:将水壶放在炉子上");
  15. BoilingDelegate d = new BoilingDelegate(Boil);
  16. IAsyncResult result = d.BeginInvoke(BoilingFinishedCallback, null);
  17. Console.WriteLine("小文:开始整理家务...");
  18. for (int i = 0; i < 20; i++)
  19. {
  20. Console.WriteLine("小文:整理第{0}项家务...", i + 1);
  21. Thread.Sleep(1000);
  22. }
  23. }
  24. static void BoilingFinishedCallback(IAsyncResult result)
  25. {
  26. AsyncResult asyncResult = (AsyncResult)result;
  27. BoilingDelegate del = (BoilingDelegate)asyncResult.AsyncDelegate;
  28. Console.WriteLine("(烧水一共用去{0}时间)", del.EndInvoke(result));
  29. Console.WriteLine("小文:将热水灌到热水瓶");
  30. Console.WriteLine("小文:继续整理家务");
  31. }
  32. }

EndInvoke会使得调用线程阻塞,直到异步函数处理完成。EndInvoke会使得调用线程阻塞,直到异步函数处理完成。EndInvoke会使得调用线程阻塞,直到异步函数处理完成。EndInvoke会使得调用线程阻塞,直到异步函数处理完成。EndInvoke调用的返回值也就是异步处理函数的返回值。

3. 泛型委托

[Serializable]

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs;

[csharp] view plaincopy

  1. class IntEventArgs : System.EventArgs
  2. {
  3. public int IntValue { get; set; }
  4. public IntEventArgs() { }
  5. public IntEventArgs(int value)
  6. { this.IntValue = value; }
  7. }
  8. class StringEventArgs : System.EventArgs
  9. {
  10. public string StringValue { get; set; }
  11. public StringEventArgs() { }
  12. public StringEventArgs(string value)
  13. { this.StringValue = value; }
  14. }
  15. class Program
  16. {
  17. static void PrintInt(object sender, IntEventArgs e)
  18. {
  19. Console.WriteLine(e.IntValue);
  20. }
  21. static void PrintString(object sender, StringEventArgs e)
  22. {
  23. Console.WriteLine(e.StringValue);
  24. }
  25. static void Main(string[] args)
  26. {
  27. EventHandler<IntEventArgs> ihandler =
  28. new EventHandler<IntEventArgs>(PrintInt);
  29. EventHandler<StringEventArgs> shandler =
  30. new EventHandler<StringEventArgs>(PrintString);
  31. ihandler(null, new IntEventArgs(100));
  32. shandler(null, new StringEventArgs("Hello World"));
  33. }
  34. }

4. 匿名方法

http://www.cnblogs.com/daxnet/archive/2008/11/12/1687011.html

只需要给出方法的参数列表(甚至也可以不给)以及方法具体实现,而不需要关心方法的返回值,更不必给方法起名字。最关键的是,只在需要的地方定义匿名方法,保证了代码的简洁。比如用于委托作为函数参数。

[csharp] view plaincopy

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> names = new List<string>();
  6. names.Add("Sunny Chen");
  7. names.Add("Kitty Wang");
  8. names.Add("Sunny Crystal");
  9. List<string> found = names.FindAll(
  10. delegate(string name)
  11. {
  12. return name.StartsWith("sunny",
  13. StringComparison.OrdinalIgnoreCase);
  14. });
  15. if (found != null)
  16. {
  17. foreach (string str in found)
  18. Console.WriteLine(str);
  19. }
  20. }
  21. }

5. Lambda表达式

http://www.cnblogs.com/daxnet/archive/2008/11/14/1687010.html

从委托的角度来看,Lambda表达式与匿名方法没有区别。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。

[csharp] view plaincopy

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> names = new List<string>();
  6. names.Add("Sunny Chen");
  7. names.Add("Kitty Wang");
  8. names.Add("Sunny Crystal");
  9. List<string> found = names.FindAll
  10. (
  11. // Lambda Expression Implementation
  12. name => name.StartsWith(
  13. "sunny",
  14. StringComparison.OrdinalIgnoreCase)
  15. );
  16. if (found != null)
  17. {
  18. foreach (string str in found)
  19. Console.WriteLine(str);
  20. }
  21. }
  22. }

6. 事件

http://www.cnblogs.com/daxnet/archive/2008/11/21/1687008.html

事件由委托定义。事件的触发方只需要确定好事件处理函数的签名即可。也就是说,触发方只需要定义在事件发生时需要传递的参数,而在订阅方,只需要根据这个签名定义一个处理函数,然后将该函数“绑定”到事件列表,就可以通过签名中的参数,对事件做相应的处理。

时间: 2024-10-26 19:24:04

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件的相关文章

18、(番外)匿名方法+lambda表达式

概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数. C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部.也不能在匿名方法外部使用的ref和out参数.

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

Cocos2d-x v3.0 新的事件调度方法 lambda表达式的使用

欢迎添? Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/24603251 Cocos 2d-x 3.0 版本号中引入了C++ 11的特性.当中就包括了回调函中使用Lambda对象. 以下我们来看一段TestCpp中的代码: 在上图的触摸事件的回调函数中,共使用了三次Lambda表达式: [ ](Touch * touch,Event * event){ }; 以下我们就来介绍一

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

c# 匿名方法(函数) 匿名委托 内置泛型委托 lamada

匿名方法:通过匿名委托 .lamada表达式定义的函数具体操作并复制给委托类型: 匿名委托:委托的一种简单化声明方式通过delegate关键字声明: 内置泛型委托:系统已经内置的委托类型主要是不带返回值的Action<T1,,,,Tn>和带返回值的Func<T1,,,Tn,Tresult> 实例代码 class demoFunc { /// <summary> /// 定义函数单条语句直接用lamada表达式 /// </summary> /// <p

C#委托异步调用

废话不多说,直接上代码(PS:我就喜欢简单.直接.粗暴) using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;using System.Threading.Tasks; namespace 异步调用委托{    class Program    {       

异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 threadpool:线程池使用,设置线程池,ManualResetEvent9 Task初步接触 10 task:waitall waitany continueWhenAny continueWhenAll  11并行运算Parallel 12 异常处理.线程取消.多线程的临时变量和lock13 A

关于委托:异常{ 无法将 匿名方法 转换为类型&ldquo;System.Delegate&rdquo;,因为它不是委托类型 }

异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数  查看如下代码: this.Invoke(delegate                 {                     MessageBox.Show("t4");                 }); 熟悉winform的开发者都知道,this是一个窗体的实例,故不做另外解释.该代

委托应用及泛型委托和多播委托

一.委托一般作为方法的参数或者返回值,或者使用多播委托(注册多个方法,可以全部触发) 1.示例:根据对于字符串不同的处理方法逻辑 private delegate void PrintString(string str); static void PrintStr( PrintString print,string str ) { print(str); } static void Method1(string str) { Console.WriteLine(str); } static vo