关于委托自己的一些理解(作为读书笔记)

以前提到委托,总感觉不好理解,简单意义是上说委托可以理解为函数的指针,可以把一个方法作为一个参数带入到另一个方法中。本人理解,请大牛指

1.首先看一个简单的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {

        //声明一个猫叫,处理主人醒,老鼠跑
        //public delegate void MyEventHandle();

        public delegate string MyDelegate(string name, int age);
        static void Main(string[] args)
        {
            //第一种方式:作为被委托调用的方法,声明为静态方法是可以调用;
            MyDelegate md = new MyDelegate(show);

        }

        private static string show(string name, int age)
        {
            return "你的名字是:" + name + "你的年龄是:" + age;
        }

首先声明一个委托Mydelegate,当show方法需要被委托是,new一个委托对象md,md就可以作为show方法的代表,md(“liupeng”,23)来处理事情。此时注意的是show方法声明的为静态方法。

运行结果如图:

那么,不声明为静态的方法能否调用了?答案是当然可以,这就是委托给我们带来的好处。此时通过对象也可以调用非静态的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {

        public delegate string MyDelegate(string name, int age);
        static void Main(string[] args)
        {

         //第二种方式:不是声明为静态的方法,作为参数被委托调用是需要实例化对象才可以被调用
            Program pg = new Program();
            MyDelegate md1 = new MyDelegate(pg.show1);
            Console.WriteLine(md1("liupeng", 23));
            Console.ReadKey();

        }

        private static string show(string name, int age)
        {
            return "你的名字是:" + name + "你的年龄是:" + age;
        }

        private string show1(string name, int age)
        {
            return "Hello" + name + "你的年龄是:" + age + "你已经成年啦!";

        }

    }

运行结果如图:

如此这是基本的委托实例。下面来看看较为经典的一道面试题目:简单说是,猫叫,主任醒,老鼠跑。(要求考虑到彼此间的连锁反应)

1.首先猫叫,引起主人醒和老鼠跑同时发生,那么就要求能够同时处理这两个事件,就好比今天项目经理要求你去见客户,但是你今天又有开发任务要完成,这两件事情必须完成,你只能处理一件事情,要想都办理,那么就得委托同时帮忙处理,所以委托也可以这么理解:当要处理的时间同时发生时,可以用委托去处理。(如有不当之处,请大牛指正,感谢!)

2.有了分析之后,那么就可以开始coding啦,三个类Cat 、Mouse、Person是所必需的,在Cat类里面声明委托的变量,定义Cat的行为:猫叫(CatCry()方法),自此分别在Mouse类、Person类中定义各自的行为,其中关键的一点就是把三种行为委托到Cat对象进行处理,cat对象调用委托方法处理传递进来的行为参数(各自的ACtion)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo
{
    public class Program
    {

        //声明一个猫叫,处理主人醒,老鼠跑
        public delegate void MyEventHandle();

        static void Main(string[] args)
        {

            //猫叫处理一系列反应
            Cat cat1 = new Cat();
            Mouse mouse = new Mouse(cat1);
            Person person = new Person(cat1);
            cat1.CatCry();//调用猫叫方法,引起连锁反应
            Console.ReadKey();

        }

    //关于面试的一道经典题目,猫叫,主人醒,老鼠跑
    //猫叫引起主人醒和老鼠跑,同时发生。
    public class Cat
    {
        public event DelegateDemo.Program.MyEventHandle eHandle;
        public void CatCry()
        {
            Console.WriteLine("睡了一觉,是时候工作啦抓老鼠啦!");
            if (eHandle != null)
            {
                eHandle();
            }
        }

    }

    public class Mouse
    {
        public void Run()
        {

            Console.WriteLine("兄弟们,黑猫醒啦,我们该逃跑啦!!Come On!");
        }

        public Mouse(Cat cat)
        {
            cat.eHandle += new Program.MyEventHandle(Run);
        }

    }

    public class Person
    {
        public void Wake()
        {
            Console.WriteLine("好烦人的黑猫,睡个觉都被吵醒啦!");
        }

        public Person(Cat cat)
        {
            cat.eHandle += new Program.MyEventHandle(Wake);
        }

    }

}

运行结果如图:

以上理解为本人菜鸟级别的,望各位大牛指导教育,小弟愿意虚心学习!!非常感谢!!!

关于委托自己的一些理解(作为读书笔记),布布扣,bubuko.com

时间: 2024-08-05 15:24:29

关于委托自己的一些理解(作为读书笔记)的相关文章

深入理解计算机系统读书笔记一 ---> 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

java内存区域——深入理解JVM读书笔记

本内容由<深入理解java虚拟机>的部分读书笔记整理而成,本读者计划连载. 通过如下图和文字介绍来了解几个运行时数据区的概念. 方法区:它是各个线程共享的区域,用于内存已被VM加载的类信息.常量.静态变量.即时编译器编译的代码等数据.JVM规范对这个区域的限制很宽松,如同堆一样不需要连续的内存.可选择固定大小.可扩展的大小外,还可以选择不实现垃圾收集.因为在些区域的垃圾收集必要性不高且效果较差.如果回收也是常量池的回收和类型的卸载,但此操作异常困难.当方法区无法满足内存的分配时,抛OutOfM

深入理解JVM读书笔记三: 虚拟机类加载机制

Java虚拟机类加载机制是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 7.1概述 与那些在编译时需要进行链接工作的语言不同,在Java语言里面,类型的加载和链接过程都是在程序运行期间完成的(其实C++也是分为静态链接库和动态链接库的),这样会在类加载时稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中天生可以动态扩展的语言特性就是依赖运行期动态加载和动态链接这个特点实现的. 7.

深入理解JVM读书笔记: Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流.采用一种类似于C语言结构体的微结构来存储数据,只有两种数据类型:无符号数和表.其中无符号数数据基本的数据类型,以u1.u2.u4.u8表示1.2.4.8字节的无符号数,用于描述数字.索引引用.数量值或者UTF-8编码字符串:表则是由无符号树和其他表的复合数据类型,以_info后缀.整个Class文件本质上就是一张表: 解析Class文件各个数据项含义: 魔数 头4个字节为魔数Magic Number,唯一作用是识别文件是否能被虚拟机接受. 版本

深入理解JVM读书笔记四: (早期)编译器优化

10.1概述 Java 语言的 "编译期" 其实是一段 "不确定" 的操作过程,因为它可能是指一个前端编译器(其实叫 "编译器的前端" 更准确一些)把 .java 文件转变成 .class 文件的过程:也可能是指虚拟机的后端运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程:还可能是指使用静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成

深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象之间相互循环引用的问题. 3.2.2 可达性分析算法 这个算法的基本思路就是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC

深入理解JVM读书笔记一: Java内存区域与内存溢出异常

Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区. 2.2 运行时数据区域 2.2.1程序计数器 程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器.字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚

深入理解JVM读书笔记五: Java内存模型与Volatile关键字

12.2硬件的效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了. 基于高速缓存的存储交互很好地理解了处理器与内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为它引入了一个新的问题: 缓存一致性(Cache Coherenc

深入理解计算机系统读书笔记之第一章:漫游

我是从豆瓣上看到好多人都在推荐这本书,于是就去借来读一读,昨天晚上用了好长时间来读这本书的第一章节,感觉这本书比较符合我(有些基础还不太明白,这本书详细的进行了讲解,很好). 下面写一下我的理解(顺便回顾一下知识) 第一节主要讲的是: A Tour of Computer Systems 以hello.c为例进行讲解,介绍这个程序如何从一个源程序变成可执行程序,再到执行,显示屏上出现“hello,world” ···········································

深入理解计算机系统读书笔记之第二章信息的表示和处理

这一章读完,嗯,感觉怎么说呢? 就是读完了而已,没有想第一章那样,有具体的一些收获什么的.可能是没有很认真的阅读.读的很匆忙,有的内容很晦涩难懂............ 不管怎样还是在写一写自己的收获吧 这一章讲的是信息的表示和处理, 信息在系统中是怎样表示的呢?就是以字节来进行存储.信息就是位+上下文(第一章里面讲的) 具体的信息是怎样表示的? 带符号整数,不带符号整数,浮点数,等等. 1位运算 移位,向右移位 x>>k 分为两种形式 (1)逻辑上,向右移位就是在左端添加k个零[an-1,a