CSharp中的委托

来源:互联网 发布:linux vi复制粘贴命令 编辑:程序博客网 时间:2024/06/01 21:35

一、什么是委托

委托是一个类,它定义了方法的类型,使得可以将方法当作另外一个方法的参数来进行传递;调用委托的时候,委托包含的所有方法将被执行。

二、委托的定义

public delegate void MyDel(int x);

public delegate string MyDel2(string msg);

三、声明委托变量

MyDel md;

四、初始化委托

md = new MyDel(方法名(intx));

五、委托赋值

md =方法名(int x);

六、多播委托

MyDelmd = new MyDel(M1);

md += M1; //增加方法

md += M1; //增加方法

md1= M1;  //减少方法

七、委托的调用

if(md !=null)

md.Invoke();

八、匿名方法

delegate int MyDel (int x); //定义一个委托

MyDeldel = delegate( int x){ return x; };

九、Lambda表达式

delegate int MyDel (int x); //定义一个委托

MyDeldel2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式

十、委托示例

1.委托实现不通的国家输出不同的问候语

        /// <summary>

        ///定义无返回值带字符串参数的委托

        /// </summary>

        /// <paramname="name"></param>

        delegate void ShowHiDelegate(stringname);

 

        /// <summary>

        ///输出问候语

        /// </summary>

        /// <paramname="name"></param>

        /// <paramname="show"></param>

        static void SayHi(string name,ShowHiDelegate show)

        {

            show.Invoke(name);

        }

 

        /// <summary>

        ///输出中文问候语

        /// </summary>

       /// <param name="name">名字</param>

        static void SayChina(string name)

        {

            Console.WriteLine("你好:" + name);

        }

 

        /// <summary>

        ///输出英文问候语

        /// </summary>

       /// <param name="name">名字</param>

        static void SayEnglish(string name)

        {

            Console.WriteLine("Hi," +name);

        }

 

        static void Main(string[] args)

        {

            ShowHiDelegate showChina = newShowHiDelegate(SayChina);

           //输出中文问候语

            SayHi("张三", showChina);

 

            ShowHiDelegate showEnglish = newShowHiDelegate(SayEnglish);

           //输出中文问候语

            SayHi("Tony",showEnglish);

 

           Console.WriteLine("----------------------------------------");

            Console.WriteLine("多播委托实现打招呼");

           //多播委托输出

            ShowHiDelegate sd = newShowHiDelegate(SayChina);

            sd += SayEnglish;

            SayHi("Tom", sd);

            Console.ReadKey();

        }

输出结果:

计算机生成了可选文字:, ile:/, 以 7 我 的 文 / v u 引 靈 u 引 。 2013/Projects/DelegateDemo/ConsoleDelegeteDemo/bin/„ 你 好 张 三 Hi-Tony 尔 好 灬 Hi.Tom

十一、Lamdba表达式在实际中的应用

            List<int> list = newList<int>() { 1, 3, 2, 4, 6, 5, 8, 7, 9 };

            list.Sort();

            Console.WriteLine("操作源数组");

            foreach (int item in list)

            {

                Console.Write(item +"\0");

            }

            Console.WriteLine();

 

            Console.WriteLine("找出大于4的所有数");

            //找出大于4的数

            System.Collections.IEnumerableenumerable = list.Where(x => x > 4);

            foreach (int item in enumerable)

            {

               Console.Write(item+"\0");

            }

            Console.WriteLine();

            Console.ReadKey();

输出结果:

计算机生成了可选文字:' ' 1 / 我 的 文 / vi “ e 丨 u 引 。 2013/Projects/DelegateDemo/ConsoleDetegateDemo/bin/... ' 一 操 作 源 数 组 1 2 3 4 5 6 7 8 9 找 出 大 于 4 的 所 有 数 5 6 7 8 9

十二、C#中已定义好的委托(泛型委托Action<>)

1.带参无返回值委托

///<summary>

///输出问候语

///</summary>

///<param name="name"></param>

///<param name="show"></param>

staticvoid SayHi(string name, Action<string> show)

{

    show.Invoke(name);

}

 

///<summary>

///输出中文问候语

///</summary>

/// <param name="name">名字</param>

staticvoid SayChina(string name)

{

   Console.WriteLine("你好:" +name);

}

 

///<summary>

///输出英文问候语

///</summary>

/// <param name="name">名字</param>

staticvoid SayEnglish(string name)

{

    Console.WriteLine("Hi," + name);

}

 

staticvoid Main(string[] args)

{

   #region委托demo

    Action<string> showChina = newAction<string>(SayChina);

    //输出中文问候语

   SayHi("张三", showChina);

 

    Action<string> showEnglish = newAction<string>(SayEnglish);

    //输出中文问候语

    SayHi("Tony", showEnglish);

 

   Console.WriteLine("----------------------------------------");

   Console.WriteLine("多播委托实现打招呼");

    //多播委托输出

    Action<string> sd = newAction<string>(SayChina);

    sd += SayEnglish;

    SayHi("Tom", sd);

    Console.ReadKey();

    #endregion

}

2.带参带返回值委托(Func<>)

///<summary>

///输出问候语

///</summary>

///<param name="name"></param>

///<param name="show"></param>

publicstring SayHi(string name, Func<string, string> show)

{

    return show.Invoke(name);

}

 

///<summary>

///输出中文问候语

///</summary>

/// <param name="name">名字</param>

publicstring SayChina(string name)

{

   return "你好:" + name;

}

 

///<summary>

///输出英文问候语

///</summary>

/// <param name="name">名字</param>

publicstring SayEnglish(string name)

{

    return "Hi," + name;

}

staticvoid Main(string[] args)

{

 

 

   #region委托demo(Func实例)

 

    FuncDemo fd = new FuncDemo();

    Func<string, string> showChina = newFunc<string, string>(fd.SayChina);

    //输出中文问候语

   Console.WriteLine(fd.SayHi("张三",showChina));

 

    Func<string, string> showEnglish =new Func<string, string>(fd.SayEnglish);

    //输出中文问候语

   Console.WriteLine(fd.SayHi("Tony", showEnglish));

 

   Console.WriteLine("----------------------------------------");

   Console.WriteLine("多播委托实现打招呼");

    //多播委托输出

    Func<string, string> sd = newFunc<string, string>(fd.SayChina);

    sd += fd.SayEnglish;

    foreach (Func<string, string> item insd.GetInvocationList())

    {

       Console.WriteLine(item.Invoke("Tom"));

    }

    Console.ReadKey();

    #endregion

}

输出结果:

计算机生成了可选文字:, ile:/, 以 7 我 的 文 / v u 引 u 引 。 2013/Projects/DelegateDemo/ConsoleDetegateDemo/bin/... 你 好 张 三 Hi-Tony 尔 好 灬 Hi.Tom

0 0