Step 1.为什么用委托

其实很简单,当我们需要把方法传递给方法时,在C#中我们就需要使用委托。

委托类似于 C++ 函数指针,但它是托管的,类型安全的。

Step 2.怎么声明委托

委托的语法很简单,这点类似方法的定义,只是在前面多了个关键字:Delegate

我们声明一个委托,其实就是告诉编译器这种类型的委托代表哪种类型的方法,这样我们就可以创建一个或多个委托实例。

Step 3.举例

实例1

using System;

namespace Delegate
{

// 定义了一个返回值为void,两个int型参数的委托
    public delegate void CalculateInt(int a,int b);

class Calculate
    {
        public static void Add(int a, int b)
        {
            Console.WriteLine(a + b);
        }

public static void Square(int a, int b)
        {
            Console.WriteLine(a * b);
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            CalculateInt calculateInt = new CalculateInt(Calculate.Add);// 实例化委托

// 这里实现了一个多播委托,特别强调的是多播委托的返回值类型必须为void的类型
            calculateInt += new CalculateInt(Calculate.Square);
            calculateInt(2, 4);
            Console.Read();
           
        }
    }
}

实例 2

可以向排序算法传递对比较两个对象的方法的引用。分离比较代码使得可以采用更通用的方式编写算法。

public delegate bool CompareObject(object obj1,object obj2);

class SortObjectArray
    {

// coampareObject是一个委托实例
        public static void Sort(object[] arrayList, CompareObject coampareObject)
        {
            for (int i = 0; i < arrayList.Length; i++)
            {
                for (int j = i + 1; j < arrayList.Length; j++)
                {
                    if(coampareObject(arrayList[i],arrayList[j]) )
                    {
                        object temp = arrayList[i];
                        arrayList[i] = arrayList[j];
                        arrayList[j] = temp;
                    }
                }
            }
        }
    }

class Student
    {
        string stuName;
        public Student(string stuName)
        {
            this.stuName= stuName;
        }

public string Name
        {
            get { return stuName; }
        }

public static bool CompareName(object obj1, object obj2)
        {
            Student stu1 = obj1 as Student;
            Student stu2 = obj2 as Student;
            if (null != stu1 && null != stu1)
            {
                if (stu1.stuName.CompareTo(stu2.stuName) > 0)
                {
                    return true;
                }
            }
            return false;
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            Student[] students = { new Student("Matthew"), new Student("Norris") ,new Student("Grant"),new Student("Aron")};
            SortObjectArray.Sort(students,new CompareObject(Student.CompareName));
            foreach (Student stu in students)
            {
                Console.WriteLine(stu.Name);
            }
            Console.Read();
           
        }
    }

转载于:https://www.cnblogs.com/matthew/archive/2008/08/15/1268024.html

什么是委托,如何实现委托相关推荐

  1. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  2. C# 委托 (一)—— 委托、 泛型委托与Lambda表达式

    C# 委托 (一)-- 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可 ...

  3. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  4. 转载-C#委托之多播委托( 二)

    通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止 示例如下:Action为无参委托 static void ...

  5. C# 委托、匿名委托、Lambda表达式详解

    文章目录 委托 委托概述 声明委托类型 创建委托对象 给委托赋值 组合委托 为委托添加方法 从委托移除方法 调用委托 委托的示例 调用带有返回值的委托 调用带有引用参数的委托 匿名方法 使用匿名方法 ...

  6. 委托学习——4. 委托的高级使用

    1. 多播(Multicast)委托:一个委托内部封装多个方法 使用形式如下 action1 += action2;//action1先把action2封装 action1 += action3;// ...

  7. C#委托,多播委托,匿名委托,事件

    委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址.调用委托的时候,委 ...

  8. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  9. C#学习记录(七)委托、高级委托

    目录 1.什么是委托 2.委托的一般使用 3.多播(multicast)委托 1.什么是委托 委托(delegate)是函数指针的升级版 实例C/C++中的函数指针 一切皆地址 变量(数据)是以某个地 ...

  10. c# 委托 与事件——委托(加深理解)

    接触c# 已经有段时间,也在项目中历练了一段时间.回头看一看,是时候总结下这段时间的不足,给自己的模糊处,做个标记.首先是: 事件与委托 原因:应用频繁,使用方便 c#委托(Delegate) 首先委 ...

最新文章

  1. 《赛博朋克2077》是捏脸游戏?上科大学生社团开发了一款赛博“滤镜”
  2. jcenter下载慢
  3. [转]GridView 72般绝技
  4. linux环境 phpstudy集成环境中设置php永久环境变量
  5. celery定时任务简单使用
  6. 4245: KI的斐波那契 递归
  7. js转义字符 php 反转义6,JS实现HTML标签转义及反转义
  8. pytorch学习笔记(3):常用网络层介绍
  9. Spring RedisTemplate 批量获取值的2种方式
  10. Sqlite中文资料
  11. Android ImageView(插入图片)属性详解
  12. 7.性能之巅 洞悉系统、企业与云计算 --- 内存
  13. 在Linux中编译jrtplib
  14. CodeSmith 7.01破解
  15. 小学生学AD16(入门级别,看这篇就够了)
  16. 面试秘籍 | 测试工程师的简历该怎么写?(带样例)
  17. vue动态添加下划线
  18. 深度解密 Python 列表的实现原理
  19. 基于java+springboot+mybatis+vue+elementui的眼镜商城系统
  20. 服务器无盘网卡设置,安装无盘时各种网卡最佳设置

热门文章

  1. SMSD短信转发群发工具详细使用教程
  2. linux桌面版mint安装,在Linux Mint系统上安装Spotify桌面客户端的方法
  3. mapper.xml中大于、小于、不等于号的方法
  4. 克服“水土不服”,融云助攻小象直播杀破“出海重围”
  5. 抽签 c++二分查找
  6. 第21篇:判断Weblogic详细版本号的方法总结
  7. 9个有趣又实用的在线学习网站,个个免费高质量,刷到别错过
  8. c# 跨网段扫描的方法
  9. 【SCI征稿】IEEE旗下1区人工智能类SCI, 稳定检索22年,仅3个月左右录用~
  10. 关于网上购物流程和如何维护网购权益