1. delegate的定义:

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

其声明如下:

public delegate string TestDelegate(string message);

在定义委托时,必须给出它所代表的方法签名和返回类型。 通过delegate关键字来声明委托;

上面的代码定义了一个名字叫 TestDelegate的委托,它所代表的方法有一个string参数,并且其返回类型是string。 委托是一种特殊的对象类型,别的对象都包含数据,委托包含的是方法的地址。 可以在定义类的任何地方定义委托。

2. delegate简单示例

//copy by msdn,changed by Cai
using System;

// Declare delegate -- defines required signature:
delegate void SampleDelegate(string message);

public class Delegate_Cai
{
    // Regular method that matches signature:
    public void ShowMsg(string message)
    {
        Console.WriteLine(message);
    }
}

public class Test_Delegate_Cai
    {
    public void Test1()
    {
        Delegate_Cai dd=new Delegate_Cai();

        // Instantiate delegate with named method:
        SampleDelegate d1=dd.ShowMsg;

        // Instantiate delegate with anonymous method:
        //匿名方法
        SampleDelegate d2 = delegate(string message)
        {
            Console.WriteLine(message);
        };
        // Create an instance of the delegate with method;
        SampleDelegate d3=new SampleDelegate(dd.ShowMsg);


        d1("Hello");
        d2(" World");
        d3("static");
    }
  }

3. 应用委托、匿名方法的例子:

//-------------------------- 委托和匿名方法、lambda表达式的例子----------------------------------------
    public class testDelegate2
    {
        //定义委托
        public delegate bool stringFilter(string i);

        //定义命名方法
        public bool ContainFunc(string s)
        {
            if (s.Contains("bei") && s.Length > 5)
                return true;
            else
                return false;
        }

        public List<string> SelectString(List<string> s, stringFilter startFilter)
        {
            List<string> str = new List<string> { };
            foreach (string item in s)
            {
                if (startFilter(item))
                    str.Add(item);
            }
            return str;
        }


        //通过委托可以编写高可重用的代码
        public void testFunc()
        {
            //stringFilter myfilter = ContainFunc;

            List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan","hubei","beijing" };
            List<string> result = SelectString(str, ContainFunc);
            foreach (string s in result)
            {
                Console.WriteLine(" " + s);
            }
        }


        //通过匿名方法来指定委托方法
        public void testFunc2()
        {
            List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan", "hubei", "beijing" }; 
            List<string> result = SelectString(str, delegate(string s) { return (s.Contains("bei") && s.Length > 5); });
            foreach (string s in result)
            {
                Console.WriteLine(" " + s);
            }
        }

        //通过lambda表达式来指定委托方法
        public void testFunc3()
        {
            List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan", "hubei", "beijing" };
            List<string> result = SelectString(str, s => (s.Contains("h") && s.Length > 5));
            foreach (string s in result)
            {
                Console.WriteLine(" " + s);
            }
        }
    }

4. 委托与接口

泛型概述

   委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

在以下情况中使用委托:

  • 当使用事件设计模式时。
  • 当封装静态方法可取时。
  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
  • 要方便的组合。
  • 当类可能需要该方法的多个实现时。

在以下情况中使用接口:

  • 当存在一组可能被调用的相关方法时。
  • 当类只需要方法的单个实现时。
  • 当使用接口的类想要将该接口强制转换为其他接口或类类型时。
  • 当正在实现的方法链接到类的类型或标识时:例如比较方法。
posted on 2012-10-17 14:40  xjc  阅读(187)  评论(0编辑  收藏  举报