委托由浅入深学习

一,简单例子

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

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

原文地址:https://www.cnblogs.com/May-day/p/6004645.html