委托由浅入深学习
一,简单例子
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,委托的好处,它能使一个对象状态的改变立即通知其他对象,而这个对象和其它的对象是完全分离的,就是互相不知道对方的存在,这样在程序规模变大的情况下更加容易维护(每一个对象的修改不涉及另一个对象),更加容易扩展,也更加灵活。
如:以上代码的两个输出老师和学生名的方法,修改老师的方法并不会影响学生方法。