CSharp中的委托

一、什么是委托

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

二、委托的定义

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; // 增加方法

md 1= 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.委托实现不通的国家输出不同的问候语

        ///

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

        ///

        ///

        delegate void ShowHiDelegate(stringname);

 

        ///

        /// 输出问候语

        ///

        ///

        ///

        static void SayHi(string name,ShowHiDelegate show)

        {

            show.Invoke(name);

        }

 

        ///

        /// 输出中文问候语

        ///

       /// 名字

        static void SayChina(string name)

        {

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

        }

 

        ///

        /// 输出英文问候语

        ///

       /// 名字

        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();

        }

输出结果:

CSharp中的委托_第1张图片

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

            List list = newList() { 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();

输出结果:

CSharp中的委托_第2张图片

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

1.带参无返回值委托

///

/// 输出问候语

///

///

///

staticvoid SayHi(string name, Action show)

{

    show.Invoke(name);

}

 

///

/// 输出中文问候语

///

/// 名字

staticvoid SayChina(string name)

{

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

}

 

///

/// 输出英文问候语

///

/// 名字

staticvoid SayEnglish(string name)

{

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

}

 

staticvoid Main(string[] args)

{

   #region 委托demo

    Action showChina = newAction(SayChina);

    // 输出中文问候语

   SayHi("张三", showChina);

 

    Action showEnglish = newAction(SayEnglish);

    // 输出中文问候语

    SayHi("Tony", showEnglish);

 

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

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

    //多播委托输出

    Action sd = newAction(SayChina);

    sd += SayEnglish;

    SayHi("Tom", sd);

    Console.ReadKey();

    #endregion

}

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

///

/// 输出问候语

///

///

///

publicstring SayHi(string name, Func show)

{

    return show.Invoke(name);

}

 

///

/// 输出中文问候语

///

/// 名字

publicstring SayChina(string name)

{

   return "你好:" + name;

}

 

///

/// 输出英文问候语

///

/// 名字

publicstring SayEnglish(string name)

{

    return "Hi," + name;

}

staticvoid Main(string[] args)

{

 

 

   #region 委托demo(Func实例)

 

    FuncDemo fd = new FuncDemo();

    Func showChina = newFunc(fd.SayChina);

    // 输出中文问候语

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

 

    Func showEnglish =new Func(fd.SayEnglish);

    // 输出中文问候语

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

 

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

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

    //多播委托输出

    Func sd = newFunc(fd.SayChina);

    sd += fd.SayEnglish;

    foreach (Func item insd.GetInvocationList())

    {

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

    }

    Console.ReadKey();

    #endregion

}

输出结果:

CSharp中的委托_第3张图片

你可能感兴趣的:(委托,CSharp)