zoukankan      html  css  js  c++  java
  • 委托由浅入深学习

    一,简单例子

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

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

  • 相关阅读:
    java 技术社区!!
    有关 gridview的 (做东西 容易忘记 记下!)
    【C#复习之虚方法vs抽象类】08.4.3 上午
    高分求解答!!!
    【学习笔记】asp.net MVC!
    asp.net ajax 尝试 之很好很强大!08.4.4
    Linux流量监控工具 – iftop (最全面的iftop教程)
    linux下查看某目录占用的空间大小
    基于CentOS的Linux基本网络配置,包括网卡eth0、DNS、Host等
    ubuntu安装ssh服务
  • 原文地址:https://www.cnblogs.com/May-day/p/6004645.html
Copyright © 2011-2022 走看看