1. 委托

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

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

  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. }
    class Program
{
delegate int CalculateDelegate(int a, int b); int add(int a, int b)
{
return a + b;
} static void Main(string[] args)
{
CalculateDelegate d = new Program().add;
//CalculateDelegate d = new CalculateDelegate(new Program().add);
Console.WriteLine(d(1, 2));
Console.ReadKey();
}
}

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

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

2. 异步调用

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

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

  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. }
class Program
{
static TimeSpan Boil()
{
DateTime begin = DateTime.Now;
Console.WriteLine("水壶:开始烧水...");
Thread.Sleep(6000);
Console.WriteLine("水壶:水已经烧开了!");
return DateTime.Now - begin;
}
delegate TimeSpan BoilingDelegate(); static void Main(string[] args)
{
Console.WriteLine("小文:将水壶放在炉子上");
BoilingDelegate d = new BoilingDelegate(Boil);
IAsyncResult result = d.BeginInvoke(BoilingFinishedCallback, null);
Console.WriteLine("小文:开始整理家务...");
for (int i = 0; i < 20; i++)
{
Console.WriteLine("小文:整理第{0}项家务...", i + 1);
Thread.Sleep(1000);
}
} static void BoilingFinishedCallback(IAsyncResult result)
{
AsyncResult asyncResult = (AsyncResult)result;
BoilingDelegate del = (BoilingDelegate)asyncResult.AsyncDelegate;
Console.WriteLine("(烧水一共用去{0}时间)", del.EndInvoke(result));
Console.WriteLine("小文:将热水灌到热水瓶");
Console.WriteLine("小文:继续整理家务");
}
}

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

3. 泛型委托

[Serializable]

publicdelegatevoid EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs;

  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. }
class IntEventArgs : System.EventArgs
{
public int IntValue { get; set; }
public IntEventArgs() { }
public IntEventArgs(int value)
{ this.IntValue = value; }
} class StringEventArgs : System.EventArgs
{
public string StringValue { get; set; }
public StringEventArgs() { }
public StringEventArgs(string value)
{ this.StringValue = value; }
} class Program
{
static void PrintInt(object sender, IntEventArgs e)
{
Console.WriteLine(e.IntValue);
} static void PrintString(object sender, StringEventArgs e)
{
Console.WriteLine(e.StringValue);
} static void Main(string[] args)
{
EventHandler<IntEventArgs> ihandler =
new EventHandler<IntEventArgs>(PrintInt);
EventHandler<StringEventArgs> shandler =
new EventHandler<StringEventArgs>(PrintString); ihandler(null, new IntEventArgs(100));
shandler(null, new StringEventArgs("Hello World"));
}
}

4. 匿名方法

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

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

  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. }
class Program
{
static void Main(string[] args)
{
List<string> names = new List<string>();
names.Add("Sunny Chen");
names.Add("Kitty Wang");
names.Add("Sunny Crystal"); List<string> found = names.FindAll(
delegate(string name)
{
return name.StartsWith("sunny",
StringComparison.OrdinalIgnoreCase);
}); if (found != null)
{
foreach (string str in found)
Console.WriteLine(str);
}
}
}

5. Lambda表达式

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

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

  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. }
class Program
{
static void Main(string[] args)
{
List<string> names = new List<string>();
names.Add("Sunny Chen");
names.Add("Kitty Wang");
names.Add("Sunny Crystal"); List<string> found = names.FindAll
(
// Lambda Expression Implementation
name => name.StartsWith(
"sunny",
StringComparison.OrdinalIgnoreCase)
); if (found != null)
{
foreach (string str in found)
Console.WriteLine(str);
}
}
}

6. 事件

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

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

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

  1. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

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

    概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...

  3. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  4. C#多线程+委托+匿名方法+Lambda表达式

    线程 下面是百度写的: 定义英文:Thread每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它 ...

  5. C#委托总结-匿名方法&Lambda表达式

    1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...

  6. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  7. 匿名函数 =匿名方法+ lambda 表达式

    匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...

  8. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

  9. 委托+内置委托方法+多播委托+lambda表达式+事件

    委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...

随机推荐

  1. Median of Two Sorted Arrays 解答

    Question There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median o ...

  2. (转载)HDU4565

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 这个博客讲的比较好:http://blog.csdn.net/ljd4305/article/d ...

  3. poj1001(高精度)

                                                               Exponentiation Time Limit: 500MS   Memory ...

  4. sde需要注意的几个常见问题

      Desktop 10.4 是32位的,Server 10.4是64位的,因此位的Oracle客户端,位的Oracle客户端. 如果Desktop和Server安装在同一台机器上,那么Oracle客 ...

  5. 移除UIView上面的所有控件

    ;i<[view.subviews count];i++){ [ [ view.subviews objectAtindex:i] removeFromsuperview]; }

  6. 【SDUT 3038】迷之博弈

    action=showproblem&problemid=3038">[SDUT 3038]迷之博弈 简直就是上次省赛的缩减版... 仅仅只是这个是链 省赛是环. ..1 2先 ...

  7. CCCardinalSplineBy概念

    cardianl 红衣主教 这个类是样条曲线动作, 其创建函数是CCCardinalSplineBy::create(float duration, cocos2d::CCPointArray *po ...

  8. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  9. linux系统如何限制远程登录ip

    在Linux系统上限制远程登录的IP,使用系统自带的配置文件. /etc/hosts.allow /etc/hosts.deny 匹配原则  先allow 后deny. 要求: 只允许 192.168 ...

  10. js 的try catch

    语法: try { //在此运行代码 } catch(err) { //在此处理错误 } 注意:try...catch 使用小写字母.大写字母会出错. <script language=&quo ...