zoukankan      html  css  js  c++  java
  • 【C#图解教程学习笔记】第13章 委托

    13.1 什么是委托

    • 委托是持有一个或多个方法的对象,可将一个方法传递到另一个方法。
    • 委托是用户自定义的引用类型。

    13.2 委托概述

    • 类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列预定义操作。
    • 委托中的方法可以是实例方法,也可以是静态方法。
    • 在调用委托的时候,会执行其调用列表中的所有方法。

    13.3 声明委托类型

    delegate void SayHelloDelegate(string s);//1.以delegate关键字开头  2.后缀添加Delegate,以表明是委托

    13.4 创建委托对象

    SayHelloDelegate mydelegate1, mydelegate2;
    mydelegate1 = new SayHelloDelegate(a.CSayHello);//实例化委托对象的方法1
    mydelegate2 = a.CSayHello;//实例化委托对象的方法2

    13.5 给委托赋值

    • 委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收。

    13.6 组合委托

    SayHelloDelegate mydelegate1, mydelegate2, mydelegate3;
    mydelegate1 = new SayHelloDelegate(a.CSayHello);
    mydelegate2 = a.CSayHello;
    mydelegate3 = mydelegate1 + mydelegate2;//组合委托

    13.7 为委托添加方法

    SayHelloDelegate mydelegate1;
    mydelegate1 = new SayHelloDelegate(a.CSayHello);
    mydelegate1 += a.ESayHello;//使用"+="为委托添加方法

    13.8 从委托移除方法

    SayHelloDelegate mydelegate1;
    mydelegate1 = new SayHelloDelegate(a.CSayHello);
    mydelegate1 += a.ESayHello;
    mydelegate1 -= a.CSayHello;//使用“-=”从委托移除方法
    • 将从调用列表的最后开始搜索,并且移除第一个与方法匹配的实例。
    • 试图删除委托中不存在的方法,编译时不会报错。
    • 试图调用空委托会抛出异常,如果调用列表为空,则委托是null。

    13.9 调用委托

    • 在调用委托的时候,会执行其调用列表中的所有方法。

    13.10 委托的示例

    略。

    13.11 调用带返回值的委托

    • 调用列表中的最后一个方法返回的值就是委托调用的返回值。
    • 调用列表中所有其他方法的返回值都会被忽略。

    13.12 调用带引用参数的委托

        //声明带有引用参数的委托类型
        delegate void MydelDelegate(ref int x);
    
        class Program
        {
            static void Main(string[] args)
            {
                A a = new A();
                MydelDelegate myDel = a.Add2;
                myDel += a.Add3;
                int x = 5;
                myDel(ref x);//在调用委托列表的下一个方法时,参数的新值会传给下一个方法。
                Console.WriteLine(x);//x输出后,x为10。  
            }
        }
    class A { public void Add2(ref int x) { x += 2; } public void Add3(ref int x) { x += 3; } }

    13.13 匿名方法

    • 匿名方法是在初始化委托时内联声明的方法。
    • 声明委托变量时作为初始化表达式。
    • 组合委托时在赋值语句的右边。
    • 为委托增加事件时在赋值语句的右边。
    delegate void MydelDelegate(int x);
    
        class Program
        {
            static void Main(string[] args)
            {
                //使用匿名方法,不需要实例化类,调用类的方法。
                MydelDelegate myDel = delegate(int x)
                {
                    x++;
                };
            }
        }

    13.14 Lambda表达式

    MydelDelegate myDel1,myDel2,myDel3,myDel4,myDel5;
    myDel1 = delegate(int x) { x = x + 1; };//匿名方法
    myDel2=          (int x)=>{ x = x + 1; };//Lambda表达式
    myDel3 =             (x)=> { x = x + 1; };//Lambda表达式
    myDel4 =              x=> { x = x + 1; };//Lambda表达式
    myDel5 =              x =>  x = x + 1;//Lambda表达式
  • 相关阅读:
    C# UserControl集合属性使用
    类属性的几个特性的含义
    C# 绘图时使用抗锯齿会多出一个像素
    Tooltip导致的无法访问已释放对象
    C#窗口闪烁问题解决
    窗口扩展风格
    动态字段列表实现及List<T>排序
    比较好用的Copy代码到博客VS扩展工具
    Dictionary与SortedDictionary
    VS2017 15.6之后支持直接反编译了
  • 原文地址:https://www.cnblogs.com/ncy123/p/10536390.html
Copyright © 2011-2022 走看看