C# 之 委托

委托(delegate)

委托是一种可以把引用存储为函数的类型。委托也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,它所定义的变量能接受的数值只能是一个函数,更确切的说,委托类型的变量可以接受的数值只能是一个函数,更确切的说,委托的变量可以接受一个函数的地址,类似于C++语言的函数指针。

委托是对函数的封装,可以当作给方法的特征指定一个名称。

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

委托的声明

委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表。

在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

下面来看一个小例子:

namespace 委托
{
    class Program
    {
        //定义一个委托ProcessDelegate,其返回类型和参数与函数Multiply()和Divide()相匹配
        delegate string  ProcessDelegate(double param1, double param2);

        //定义乘法和出除法的函数
        static string Multiply(double param1, double param2)
        {
            return Convert.ToString(param1 * param2);
        }
        static string Divide(double param1, double param2)
        {
            if (param2!=0)
            {
                return Convert.ToString(param1 / param2);
            }
            else
            {
                return "除数不能为0!";
            }
        }
        static void Main(string[] args)
        {
            ProcessDelegate process;    //使用新的委托类型声明一个变量

            //请求用户由逗号分隔两个数字,并把这些数字仿真两个double变量中
            Console.WriteLine("Enter 2 number separated with a comma:");
            string input = Console.ReadLine();
            int commaPos = input.IndexOf(‘,‘);
            double param1 = Convert.ToDouble(input.Substring(0, commaPos));
            double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));

            //让用户选择操作符
            Console.WriteLine("Enter M to mitiply or D to divide:");
            input = Console.ReadLine();

            //根据用户的选择,初始化process委托变量
            if (input=="M")
            {
                process = new ProcessDelegate(Multiply);
            }
            else
            {
                process = new ProcessDelegate(Divide);
            }

            //把委托变量看作一个函数名
            Console.WriteLine("Result:{0}", process(param1, param2));
            Console.Read();
        }
    }
}

为了说明问题,这里没有验证用户输入的有效性。如果这些是“现实中的”代码,就应花更多时间来确保在局部变量param1和param2中得到有效的值。

通过上面的小例子我们可以知道委托的具体实现步骤:

1.先声明一个委托实例

2.提供要处理的方法

3.实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法不用加括号,实例化的过程就是装载方法的过程)实例化后的委托对象就好比是C++中的指针,它本身就是封装了方法的对象

4.最后我们调用委托对象就好比调用了被封装方法本身,调用时的参数也就传给了被封装的方法

C# 之 委托,布布扣,bubuko.com

时间: 2024-11-03 21:52:18

C# 之 委托的相关文章

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

泛型委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { public delegate int DelCompare<T>(T t1, T t2); // public delegate int DelCompare(object o1, object o2); class Progra

javascript中的事件委托

这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和事件捕获机制,事件冒泡是有微软公司提出来的,事件捕获是有网景公司提出来的,当时两家是争论的不可开交,后来w3c也没办法,就采取了折中的方式,事件产生后先捕获后冒泡, 通常,在js中监听事件的方法共有三

[JS]笔记14之事件委托

-->什么是事件委托-->事件委托原理-->事件委托优点-->事件源 / 目标源 一.什么是事件委托 通俗的讲,onclick,onmouseover,onmouseout等这些就是事件 委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

事件委托能够优化js性能

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>面试题练习img居中</title> <style type="text/css"> img { /*display: table-cell; vertical-align: middle;*/ } html,body{ height: 100%; } div{ w

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等