C#一篇教你使用委托匿名

委托匿名



委托

委托

  • 下面看一个案例
//委托方法
    public delegate void  sayIt(string name);
    class Program
    {
        static void Main(string[] args)
        {
            Test("张三", sayEnglish);
            Test("张三", sayChinese);

        }
        public static void Test(string name,  sayIt say)
        {
            say(name);
        }
      
        public static void sayEnglish(string name)
        {
            Console.WriteLine($"please to say english,{name}");
        }
        public static void sayChinese(string name)
        {
            Console.WriteLine($"请说中文谢谢,{name}");
        }

    }
  • 可以看到我们可以委托一个方法,这种方法通常有相同功能,根据传入的方法名来动态调用

定义委托

  • delegate:使用此关键字即可定义一个委托,该方法没有方法体
  • 定义的委托的格式,返回值和方法参数都要和要用委托的方法,也就是自己定义的方法是一样的
  • 方法赋值,使用委托

匿名委托

public delegate void sayHi(string name);//委托方法
    public delegate int CompareIt(object o1, object o2);//比较委托
    class Program
    {
        static void Main(string[] args)
        {
            //sayHi say = delegate (string name)
            //{
            //    Console.WriteLine("say it " + name);
            //};
            //sayHi say = (string name) => { Console.WriteLine("say it " + name); };
            //say("张三");

            //object [] nums = { 4, 2, 1, 8, 49, -1 };
            //object max = getMax(nums, (object o1, object o2) =>
            // {
            //     int x1 = (int)o1;
            //     int x2 = (int)o2;
            //     return x1 - x2;
            // }
            // );
            //Console.WriteLine(max);


            object[] strs = { "12", "abc", "ksdfjlksfj;sdl" };
            object max = getMax(strs, (object o1, object o2) =>
             {
                 string str1 = (string)o1;
                 string str2 = (string)o2;
                 return str1.Length - str2.Length;
             });
            Console.WriteLine(max);
        }

        public static object getMax(object[] arr,CompareIt compareIt)
        {
            object max=arr[0];
            for(int i = 0; i < arr.Length; i++)
            {
                if (compareIt(max, arr[i])<0)
                {
                    max = arr[i];
                }
            }
            return max;
        }
    }
  • 通过设置比较委托,动态计算数组最大值但是这样需要强转,在这种情况下我们可以使用泛型委托
  • int类型比较大小,直接相减,字符串是看字符长度的。

泛型委托

//定义泛型方法和泛型委托
    public delegate int CompareIt<T>(T x, T y);
    class Program
    {
        static void Main(string[] args)
        {
            string[] strs = { "w", "3owrug", "1kd" };
            string result = getMax<String>(strs, (string o1, string o2) =>
             {
                 return o1.Length - o2.Length;
             });
            Console.WriteLine(result);
        }
        public static T getMax<T>(T[] arr, CompareIt<T> compareIt)
        {
            T max = arr[0];
            for (int i = 0; i < arr.Length; i++)
            {
                if (compareIt(max, arr[i]) < 0)
                {
                    max = arr[i];
                }
            }
            return max;
        }
    }

窗体传值案例

在这里插入图片描述

  • 窗体1代码
  private void button1_Click(object sender, EventArgs e)
        {
            //开启窗体2
            Form2 form2 = new Form2(getMsg);
            form2.Show();
        }

        /// <summary>
        /// 用于接收窗体二的值
        /// </summary>
        /// <param name="msg">窗体2的值</param>
        public void getMsg(string msg)
        {
            label1.Text = msg;
        }
  • 窗体1通过定义方法接受窗体2的值,窗体2通过委托来调用该方法

  • 窗体2的代码

//委托方法
    public delegate void GetMsg(string msg);
    public partial class Form2 : Form
    {
        private GetMsg _getMsg;

        public Form2(GetMsg getMsg)
        {
            this._getMsg = getMsg;
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
        //使用委托调用窗体1 的方法
        private void button1_Click(object sender, EventArgs e)
        {
            this._getMsg(textBox1.Text);
        }
    }

多播委托

  • 一看就懂,可以一次调用多个
public delegate void DeIt();
    class Program
    {
        static void Main(string[] args)
        {
            DeIt del = Test1;
            del += Test2;
            del += Test3;
            del += Test4;
            del -= Test3;
            del();
            //我是T1
            //我是T2
            //我是T4
        }
        public static void Test1()
        {
            Console.WriteLine("我是T1");
        }
        public static void Test2()
        {
            Console.WriteLine("我是T2");
        }
        public static void Test3()
        {
            Console.WriteLine("我是T3");
        }
        public static void Test4()
        {
            Console.WriteLine("我是T4");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值