委托由浅入深学习

一,简单例子

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

namespace SimpleDelegate
{
    class Program
    {
        private delegate String getString();
        static void Main(String[] args)
        {
            int delegat = 40;
            getString Show = new getString(delegat.ToString);
            Console.WriteLine("String is {0}", Show());    //这里Show()等价于调用delegat.ToString();
            Console.ReadLine();
        }
    }
}

简单用委托实现输出

二,多路广播委托

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

namespace Delegate
{
    class Program
    {
        public delegate void TestDelegate(string str); //定义委托
        static void Main(string[] args)
        {
            //多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方
            Student student = new Student();
            Teacher teacher = new Teacher("王四");
            TestDelegate testDelegate1 = new TestDelegate(student.StudentName); //实例委托
            testDelegate1 += teacher.TeacherName;  //可以指向不同类中的方法
            //testDelegate1 += teacher.ClassName; //指向不符的方法错误,由于类型安全性导致,因为teacher.ClassName方法不带参
            testDelegate1("张三");
            Console.ReadLine();
        }
        class Student
        {
            private String name = "";
            public Student(String _name)
            {
                this.name = _name;
            }
            public Student() { }
            public void StudentName(String _name)
            {
                if (this.name != "")
                    Console.WriteLine("学生名:{0}", this.name);
                else
                    Console.WriteLine("学生名:{0}", _name);
            }
        }
        class Teacher
        {
            private String name;
            public Teacher(String _name)
            {
                this.name = _name;
            }
            public void TeacherName(String _name)
            {
                if (this.name != "")
                    Console.WriteLine("老师名:{0}", this.name);
                else
                    Console.WriteLine("老师名:{0}", _name);
            }
            public string ClassName()
            {
                return "语文";
            }
        }
    }
}

综上:委托的简介,

1,.NET中的委托是类型安全的

2,委托类型声明的是一个类,实例化为一个对象,分配在堆中

栈:它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。

堆:是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意。

栈:由系统自动分配,速度较快。但程序员是无法控制的。

堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

3,委托的好处,它能使一个对象状态的改变立即通知其他对象,而这个对象和其它的对象是完全分离的,就是互相不知道对方的存在,这样在程序规模变大的情况下更加容易维护(每一个对象的修改不涉及另一个对象),更加容易扩展,也更加灵活。

如:以上代码的两个输出老师和学生名的方法,修改老师的方法并不会影响学生方法。

时间: 2024-10-14 23:25:02

委托由浅入深学习的相关文章

由浅入深学习.NET CLR 系列:目录

经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NET,最经典莫过于CLR via C#了,既然奉为经典,那就从这里开始吧.据此初步整理出如下目录来: 由浅入深学习.NET CLR 基础系列 CLR 的执行模型 生成.打包.部署和管理应用程序及类型 共享程序集和强命名程序集 由浅入深学习.NET CLR 设计类型 类型基础 基元类型.引用类型和值类型

委托的学习和使用(三种方式)

委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y); static void Main(string[] args) { CalculateDelegate calculateDelegate = new CalculateDelegate(Add); int resul

Mysql地毯式由浅入深学习(一)——Mysql的整体架构简介

最近我觉得自己各项技能都是随着工作而学习的,感觉总有一些知识没有掌握,特准备在基于<Mysql权威指南>和<高性能Mysql>这两本书来系统学习下,把每次学习的笔记整理成博客的形式.一是为了加深自己的印象,二是为了给自己提供更好的学习能力,三是和大家共同分享. 1.逻辑架构 第一层:并不是Mysql独有,大多数基于网络客户端.服务器工具,例如:连接处理.授权认证.安全等 第二层:核心服务层,包括查询解析.分析.优化.缓存.内置函数,所有跨域存储引擎都在这一层:存储过程.触发器.视图

01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型

.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型是一个什么样的过程呢? 将源代码编译成托管模块 --> 将托管模块合并成程序集 --> 加载公共语言运行时 --> 执行程序集的代码 目录 将源代码编译成托管模块 将托管模块合并成程序集 加载公共语言运行时 执行程序集的代码 本地代码生成器:NGen.exe Framwork类库入门 通用类

委托再学习

本文转载自深山老林 1.什么是委托? 委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联. 2.委托有什么特点? 委托类似于 C++ 函数指针,但它们是类型安全的. 委托允许将方法作为参数进行传递. 委托可用于定义回调方法. 委托可以链接在一起:例如,可以对一个事件调用多个方法. 方法不必与委托签名完全匹配. C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法. C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块.

C# 委托的学习

delegate int GetCalculatedValueDelegate(int x, int y);    //定义是个委托实际上就是抽象一类  参数列表形式和返回值相同的函数AddCalculator,SubCalculator这两个该函数的参数形式和返回值的类型就是.          static int AddCalculator(int x, int y)       {           return x + y;       }             static in

.Net 委托 delegate 学习

一.什么是委托: 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递.委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活多个方法的地址,而不是数据. 二.使用委托: 关键字:delegate 1.声明: public delegate void DoNothing();//定义一个无返回值,无参数的委托 public delegate int GetNum(int i); //定义有一个返回值int ,参数int 的委托 2.创建方法: public static vo

程序员委托事件学习随笔

委托的声明 public delegate void MyDelegate(string str); 委托是一种特殊的类型(class),用途是来实现对一种方法的封装.在某种事件发生时,自动调用该方法.好处显然易见,它使用户可以自定义自己的方法实现,通过封装,CLR会在相应事件激发时调用你定义的方法,实现你的功能. 注 1.委托的定义和方法的定义类似,只是在前面加了一个delegate,但委托不是方法,它是一种类型.是一种特殊的类型,看成是一种新的对象类型比较好理解.用于对与该委托有相 同签名的

由浅入深学习Apache httpd原理与配置

一.apache简介: Apache HTTPD又可以简称为httpd或者Apache,它是Internet使用最广泛的web服务器之一,使用Apache提供的web服务器是由守护进程httpd,通过http协议进行文本传输,默认使用80端口的明文传输方式,当然,后来,为了保证数据的安全和可靠性,又添加了443的加密传输的方式,Apache提供的服务器又被称为:补丁服务器,原因很简单,它是一款高度模块化的软件,想要给它添加相应的功能只需添加相应的模块,让其Apache主程序加载相应的模块,不需要