• 关于C#委托的一些学习笔记


    1.什么是委托就是把方法作为参数传给另一个方法。委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型)
    Public delegate void DelSayHi(string name);
    Class proglem
    {
     Static void Main(string[] args)
    {
    Test(张三,saychiese);
    Test(bob,sayenglish);
    Console.readline();
    }
    Public static void test(string name,DelSayHi del)
    {
    Del(name);
    }
    Public static void saychinese(string name)
    {
    Console.writeline(“吃了么:”+name);
    }
    Public static void sayEnglish(string name)
    {
    Console.write(“nice to meat you”+name);
    }
    }
    

    以上方法好像没有字节用方法来得直接,那么用委托到底好在哪里?


    个人认为,委托的精华事lamda表达式,如下是一个lamda表达式的小例子:
    Public delegate void SayHi(string name)
    Class progtam
    {
    Static void Main()
    {
    //lama表达式=>goes to
    SayHi del=(string name)=>{console.writeLine(“你好”+name);};
    Del(“张三”);
    Console.readKey();
    }
    }
    
    

    2.关于匿名函数(没有函数名的函数):

    类似这样的用法叫做匿名函数:

    Object result=GetMax(o,delegate(object o1,object o2){
    String s1=(string)o1;
    String s2=(string)o2;
    Return s1.Length-s2.length;
    });
    
    以下是匿名函数的完整小例子:
    Class Program
    
    {
    
    Public delegate int compatrDel(object o,objecto2)
    
    Static void main(string[] args)
    
    {
    
    Object[] 0={“abc,””fdssfhjdkgsh”,”sdfajsdfhasdjkfh”,”agshdfdashf”}
    
    Object result=GetMax(o,delegate(objecto1,object o2){
    
    String s1=(string)o1;
    
    String s2=(string)o2;
    
    Return s1.Length-s2.length;
    
    });
    
    Console.writeline(result);
    
    Console.readkey();
    
    }
    
    }
    
     
    
    Public static object GetMax(object[]nums,compatrDel del)
    
    {
    
    Object max=num[0];
    
    For(int i=0;i<nums.length;i++)
    
    {
    
    If(dek(max,num[i])<0)
    
    {
    
    Max=num[i];
    
    }
    
    }
    
    }
    

    3.泛型委托:(返回值类型和输入值类型不确定的委托)
    Public delegate int delcompare<T>(T t1,T t2);
    Class program
    {
    Static void Main(string[] args)
    {
    Int[] nums={1,2,3,4,5};
    Int max=getMax<int>(nums,compare1);
    Console.writeline(max);
    Console.readkey();
    String names={“abxd”,”sdagfdsgfd”,”sdfggsdfg”};
    getMax<string>(names,(string s1,string s2)=>{
    return s1.length-s2.length;
    })
    Console.readkey();
    }
    Public static T GetMax<T>(T[] nums,Delcompare<T> del)
    {
    T max=nums[0];
    For(int i=0;i<nums.length;i++)
    {
    If(del(max,nums[i])<0)
    {
    Max=nums[i];
    }
    }
    Return max;
    }
    Public static int Compare1(int n1,int n2)
    {
    Return n1-n2;
    }
    }
    

    4.lamda表达式的常见几种形式:
    Public delegate void delOne();
    Public delegate void delTwo(string name);
    Public delegate string DelThree(string name);
    Class Program
    {
    Static void Main(string[] args)
    {
    Delone del=()=>{};
    delTwo del2=(string name)=>{};
    delThree del3=(sting name)=>{return name;};
    list<int>  list=new list<int>() {1,2,3,4,5,6};
    list.removeAll(n=>n>4);
    foreach(var item in list)
    {
    Console.writeLine(item);
    }
    Console.readKey();
    
    }
    }
    

    其中,有一种lamda表达式的特殊形式,要特别关注:

    list<int>  list=new list<int>() {1,2,3,4,5,6};

    list.removeAll(n=>n>4);

    foreach(var item in list)

    {

    Console.writeLine(item);

    }


    5.委托的运用之窗体传值:

    在窗体1:
    
    Void showMsg(string str)
    
    {
    
    Label1.text=str;
    
    }
    
    Form2 fm=new form2(showMsg);
    
    Fm.show();
    
    窗体一又方法,没有值。
    
    窗体二,有值没有方法。
    
    在窗体2中:
    
    Public delegate void DelTest(string str);
    
    Public Deltest _del;
    
    Public Form2(DelTest del)
    
    {
    
    This._del=del;
    
    Initializevonponent();
    
    }
    
    Private void button_Click(objectsender,EventArgs e)
    
    {
    
    _del(textBox1.text);
    
    }

    通过这种方法可以实现在新窗体中控制父窗体中的控件。

    5.多播委托:(宅男我不由地想好了波多野结衣)

    委托不仅仅能指向一个函数,还能指向多个函数,这是通过duobo委托实现的。

    如下事例子:

    Public delegate void DelTest(string name);
    Class Program
    {
    Stratic void Main(string[] args)
    {
    Deltest del=T1;
    DEL+=T2;
    Del+=T3;
    Del+=T4;
    Del-=T1;
    Del();
    Console.readKey();
    }
    Public static void T1()
    {
    Console.writeLine(“我是T1”);
    }
    Public static void T2()
    {
    Console.writeLine(“我是T2”);
    }
    Public static void T3()
    {
    Console.writeLine(“我是T3”);
    }
    Public static void T4()
    {
    Console.writeline(“我是T4”);
    }
    }
    

    有一段时间没写了,之前在做一两个老师布置的小项目,希望自己能够坚持写下去。
  • 相关阅读:
    empty()与remove([expr])的区别.转
    ThinkPHP验证码刷新随机数
    ThinkPHP的cookide保存二维数组的方法
    ThinkPHP 关联模型中查询某条记录的父级(非查询子级)
    DWZ的选择带回功能无法带回第一个value中的值
    IS_POST:判断是否存在POST提交
    ThinkPHP中Xheditor编辑器报错
    一台电脑安装两个xampp的方法
    ajax中文传送到模板显示为null
    【MySQL】MySQL事务回滚脚本
  • 原文地址:https://www.cnblogs.com/CoderAyu/p/8490154.html
Copyright © 2020-2023  润新知