之乎者也,阿弥陀佛

软件设计的原则就是,化繁为简,化难为易,把人的思维集中在简单的领域,然后通过有序的组合实现复杂的逻辑。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、什么是委托?

委托类型声明的格式如下:

  //申明委托
   public delegate void TestDelegate(string message);

1.delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托是类型安全和可靠的。

2.委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:

3.委托具有以下特点:

  • 委托类似于 C++ 函数指针,但它是类型安全的。

  • 委托允许将方法作为参数进行传递。

  • 委托可用于定义回调方法。

  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。

  • 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变

  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

二、委托在.net中的几种写法

1.在.net 1.0中的写法如下:

View Code
 //申明委托签名
 public delegate void TestDelegate(string message);
//委托的匹配方法
  public static void TestMethod(string msg)
        {
            Console.WriteLine(
string.Format(".net 委托:{0}", msg));
        }

  
static void Main(string[] args)
        {
            
#region .net 1.x写法
            TestDelegate dele1 
= TestMethod;
            dele1(
".net 1.x写法");

            TestDelegate dele2 
= new TestDelegate(TestMethod);
            dele2(
".net 1.x写法");
            
#endregion
     }

2.在.net 2.0中的写法,.net 2.0中重要的是引入了匿名方法,  当然也可以使用.net1.0中的写法。


View Code
#region .net2.x写法
static void Main(string[] args)
{
  
//申明委托对象的时候直接指向一个方法(匿名)的实现
   TestDelegate dele3 = delegate(string msg)
             {
                 Console.WriteLine(
string.Format(".Net委托:{0}", msg));
             };
             dele3(
".net2.x写法--匿名方法");
}

3.在.net 3.x中的写法,引入Lambda 表达式,我们来看微软给Lambda 表达式的定义:      

“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。

所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。


View Code
  //该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块
    TestDelegate dele4 = msg => Console.WriteLine(string.Format(".Net委托:{0}", msg));
    dele4(
".net 3.x写法中可以引入Lambda 表达式");

三、委托的应用场景:

只调用单个方法时.
当一个类需要方法说明的多重执行时.
期望使用静态方法执行规范时.
期望得到一个类似事件的模式时.
调用者无需知道无需获取定义方法的对象时
只想给少数既定组件分发执行规范时.
想要简单的组成结构时.

 

posted on 2010-12-12 23:17  搏击的小船  阅读(303)  评论(0编辑  收藏  举报