• c#基础--委托


    今天又复习了一下委托的知识,并在园子里找了个不错的小例子练习了一下,做如下整理--

    首先,委托和类是一个级别的,其声明方式如下:

    public delegate int DelegateDemo(int a,int b);
    

      该委托的定义就决定了:实例化该委托时,接收的方法参数必须满足--方法返回值为int,方法有两个整型参数。

    *委托就是----我们把一批具有相同特征的方法,通过建立与具有同样相同特征的委托的一个实例来进行传递,以使其它地方能对这些方法进行调用。即把方法当作参数进行传递

    使用:

    1>简单的回调函数

    public delegate void DelA();//定义委托
    
    public void ShowMG()//定义方法
    {
    console.writeline("委托练习");
    }
    
    DelA() d=new DelA(ShowMG);//声明委托实例,并传递方法参数
    
    d();//方法回调,输出:委托练习

    2>委托链

    之前方法的基础上定义如下方法:
    public void ShowNum()
    {
    Console.WriteLine("又一个方法");
    }
    
    d+=new DelA(ShowNum);//此时委托对象d中依次传入了ShowMG,ShowNum方法
    
    d();//依次调用ShowMG,ShowNum方法

    3.小练习--通过下边小练习,本人体会到委托的一大用处:当几个方法的大部分处理逻辑相同,只有小部分逻辑不同时,可以把这一小部分逻辑抽离出来,分别定义方法,然后定义一个委托放在整个方法的改变之处,并封装成一个方法,这样,调用哪个方法,就把哪个方法传入委托就可以了--说的有些乱,看代码变很清楚了(例子非原创,觉得不错于是借鉴来整理下):

    需求:textBox内输入一串数字,','连接,'升序排列','降序排列'按钮实现数字顺序的调整:

    //1.定义一个委托,比较两个数的大小
    public delegate bool CompareDel(int n1,int n2);
    
    //2.两个方法(经过抽离,只有如下逻辑不同)
            //比较大数
            public bool GetLager(int n1,int n2)
            {
                return n1 > n2;
            }
    
            //比较小数
            public bool GetSmaller(int n1, int n2)
            {
                return !GetLager(n1,n2);
            }    
    
    //整个排序方法如下:(其中比较逻辑已由委托代替)
            public string GetResult(CompareDel del)
            {
                int temp;
                string result = "";
                int[] nums = GetArray();
                for (int i = 0; i < nums.Length - 1; i++)
                {
                    for (int j = i + 1; j < nums.Length; j++)
                    {
                        if (del(nums[i], nums[j]))
                        {
                            temp = nums[i];
                            nums[i] = nums[j];
                            nums[j] = temp;
                        }
                    }
                }
                foreach (var item in nums)
                {
                    result += item + ",";
                }
                return result.Substring(0, result.Length - 1);
            }
    
    //字符串数组转整型数组
            public int[] GetArray()
            {
                string[] strs = this.txtInput.Text.Split(',');
                int[] num = new int[strs.Length];
                for (int i = 0; i < strs.Length; i++)
                {
                    num[i] = int.Parse(strs[i]);
                }
                return num;
            }
    
    //两个按钮方法调用
         //升序排列
            protected void btnSmaller_Click(object sender, EventArgs e)
            {
                CompareClass c = new CompareClass();
                CompareDel d = new CompareDel(c.GetLager);
                this.lbShow.Text = GetResult(d);
            }
    
            
            //降序排列
            protected void btnLager_Click(object sender, EventArgs e)
            {
                CompareClass c = new CompareClass();
                CompareDel d = new CompareDel(c.GetSmaller);
                this.lbShow.Text = GetResult(d);
            }
    
    
    
        

    从这个小例子中,不难体会出委托的作用--

  • 相关阅读:
    [转]jQuery知识总结
    sqlserver2008 函数1
    使用触发器生成流水号
    日期格式
    数据库正在使用,删除不了的问题
    continue 语句
    逻辑语句和函数
    ASP.NET中的随机密码生成
    相对路径
    “基类包括字段,但其类型与控件的类型不兼容”的解决方法
  • 原文地址:https://www.cnblogs.com/baweier2013/p/3391327.html
Copyright © 2020-2023  润新知