委托的生明与使用

什么是委托
   首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
 
如何使用委托
   在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

-----------------------------------------------

定义一个委托:

委托的生明:可以在命名空间内的任何地方生明。用到的关键字: delegate

public delegate void GreetHandler();//定义委托

class Program
    {
        static void Main(string[] args)
        {
            //创建委托方法(方法一)
            //GreetHandler greetHandler;
            //greetHandler = ChineseGreet;//赋值(第一个方法只能用赋值符)
            //greetHandler += EnglishGreet;//绑定方法
            //greetHandler -= ChineseGreet;//解除绑定
            //greetHandler();//使用委托

//创建委托方法(方法二)
            GreetHandler greetHandler = new GreetHandler(ChineseGreet);
            greetHandler += EnglishGreet;
            greetHandler();
        }
        public static void ChineseGreet()
        {
            Console.WriteLine("早上好!");
        }
        public static void EnglishGreet()
        {
            Console.WriteLine("Good Morning!");
        }
    }

---------------------------------

有参数类型的委托 

先生明一个类 

class Arithmetic
    {
        public int Add(int num1,int num2)
        {
            return num1 + num2;
        }
        public int Reduce(int num1, int num2)
        {
            return num1 - num2;
        }
    }

如果参数为引用类型时 : 在参数的前面加 一个 ref 的关键字

public delegate int ArithHandler(int num1, int num2);
    class Program
    {
        static void Main(string[] args)
        {
            Arithmetic arithmetic = new Arithmetic();
            ArithHandler arithHandler = new ArithHandler(arithmetic.Add);
            arithHandler += arithmetic.Reduce;
            int result = arithHandler(5, 3);//result接收最后一个方法执行的结果
            Console.WriteLine("结果为:" + result);
        }
    }

------------------------

委托也可以调用匿名方法 很多时候是用于只调用一次的方法:

public delegate void HelloHandler();
    public delegate int CalHandler(int num1,int num2);
    class Program
    {
        static void Main(string[] args)
        {
            //将匿名方法赋给委托(无参无返回值的匿名方法)
            HelloHandler helloHandler = delegate()
            {
                Console.WriteLine("你好!");
            };
            helloHandler();

//有参有返回值的匿名方法
            CalHandler calHandler = delegate(int a, int b)
            {
                int num = a + b;
                return num;
            };
            int result = calHandler(5,3);
            Console.WriteLine(result);
        }
    }

--------------------------------------------

事件 事件是一种特殊的委托

/*********事件*************/
    public delegate void GreetHandler();//定义委托
    class Program
    {
        public static event GreetHandler MyEvent;//声明事件(发布事件)
        static void Main(string[] args)
        {
            MyEvent += new GreetHandler(ChineseGreet);//订阅事件
            MyEvent += new GreetHandler(EnglishGreet);
            MyEvent();//触发事件
        }
        public static void ChineseGreet()
        {
            Console.WriteLine("早上好!");
        }
        public static void EnglishGreet()
        {
            Console.WriteLine("Good Morning!");
        }
    }

时间: 2024-10-11 11:43:20

委托的生明与使用的相关文章

C# delegate (001)

背景:一直不是很理解C#中的委托,也不是很清楚委托应用的业务场景,有可能和自己一直做B/S有关 业务描述:C/S,父窗口打开子窗口,子窗口把自己文本框里的值传个父窗口的文本框. 子窗体代码: //定义委托        public delegate void DelegateSetText(string returnValue);       //生明变量       public DelegateSetText SetText;       private void btnClose_Cli

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

XML常用操作

C#操作XML非常简单 一是写入: 生明一个xelment 再在它的父节点Add就可以,也可以用生明的节点.SetAttribute("节点名称","节点对应的值"); 二是读取: 一样也是先生明再得到其子节点再                    if (xe.Name == "Contrast")                                            if (xe.GetAttribute("IsS

神奇的苏

摘自:http://baike.baidu.com/link?url=G1JZNud-Ful2bheE4W7yA46plGwWrXZLgX1DDAtDEbW2Zmm_YZBNs4-pLvuaPYRZiZAXjWKuvdiuknQtkziNJFVgs0ocNITjcF9FjU4yfTC 苏姓,中国姓氏.当代中国人口排行第41位,宋版<百家姓>中排行第42位.起源于周时武王封颛顼高阳氏后裔忿生于苏国,属以地为氏,后人追尊苏忿生为得姓始祖. 苏姓约有611多万人口,占中国总人口的0.47%.主要分布

RabbitMQ 声明Queue时的参数们的Power

参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this IModel model, string queue = "", bool durable = false, bool exclusive = true, bool autoDelete = true, IDictionary<string, object> arguments = null); queue:这没什么好说的,队列名

AngularJS 学习笔记 -- 指令(Directive)

AngularJS 指令学习笔记 AngularJS怎样处理指令其实是依赖于指令定义时返回的对象属性的,所以要想深入理解如何定义一个指令,首相需要理解指令定义时各个参数的含义. 完整的AngularJS指令参数 angular.module('app', []) .directive('demoDirective', function (){ // 依据官方规范,指令的定义时应该严格遵循驼峰式命名规则,使用时采用'-'连接单词 return { restrict : String in ['E'

&lt;&lt;黑马程序员&gt;&gt;预处理指令

预处理命令 ①  宏定义    ②  条件编译    ③  文件包含 宏定义: #define  A  5       不带参数的宏       ①  所有的预处理命令都是以#开头:       ②  预处理命令在程序翻译成0和1之前将程序中的A替换成5:       ③  预处理的作用域是在预处理命令开始的那一行开始,到程序的结尾:       ④  宏名一般用大写或者以看k开头,变量名一般用小写:   #define pingfang(a)  ((a)*(a))       ①  带参数的宏

java中的基本数据类型一定存储在栈中吗?

首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下: 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因 在方法中生明的变量可以是基本类型的

JAVA学习第十三课(继承下:抽象类abstract)

抽象:模糊 == 看不懂 继承:发现事物之间的共性关系,并向上抽取,以提高代码的复用性 事物里都具备这个功能,但是这个功能是什么,怎么去做,不知道,这就涉及到了抽象 1.继承:A,B两个类,都有show的功能,实现方式也一样那么就可以向上抽取其共性,做新类,使A,B继承于新类. 2.抽象:A,B两个类,都有show的功能,但是功能的实现方式不一样,那么向上抽取其方法生明,但是内容不一样,那么就用关键字abstract标识,表示抽象函数,那么这个类也必须用abstract标识,表示抽象类 abst