• 委托由浅入深学习


    一,简单例子

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

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

  • 相关阅读:
    【Leetcode】【Medium】Group Anagrams
    【Leetcode】【Hard】Merge k Sorted Lists
    面向.Net程序员的Sql版本管理
    分享改进 完全定制自己的代码生成器
    面向.Net程序员的后端性能优化实战
    一个winform带你玩转rabbitMQ
    vs多项目模板及add-in开发
    面向.Net程序员的前端优化
    面向.Net程序员的dump分析
    【网络安全】(一) 0成本添加访问级监控
  • 原文地址:https://www.cnblogs.com/May-day/p/6004645.html
Copyright © 2020-2023  润新知