虽然说的是设计模式,但是还是要补充一些知识,虽然基本用法我们都懂,但是个人觉得下面的例子更为精彩
直接看代码
public delegate void StringAssignmentEventHandler(); public class InvokeList { List<StringAssignmentEventHandler> handlers; string[] message = new string[3]; public InvokeList() { handlers = new List<StringAssignmentEventHandler>(); handlers.Add(AppendHello); handlers.Add(AppendComma); handlers.Add(AppendWorld); } public void Invoke() { handlers.ForEach(x => x());//代替for循环的方式 } public void AppendHello() { message[0] = "hello"; Console.WriteLine(message[0]); } public void AppendComma() { message[1] = ","; } public void AppendWorld() { message[2] = "World"; } //实现索引 public string this[int index] { get { return message[index]; } } }
以上虽然实现代理,但是我觉得真正要看的不是代理,这里的代理不是规范的,主要看
handlers.ForEach(x => x());//代替for循环的方式,
public string this[int index] { get { return message[index]; } }
这么2中写法
好,那么微软标准代理写法怎么做呢
public class InvokeList1 { //第一次改进办法 shift+alt+alt切换全屏 public InvokeList1() { StringAssignmentEventHandler handler = null; handler += new StringAssignmentEventHandler(AppendHello); handler += new StringAssignmentEventHandler(AppendComma); handler += new StringAssignmentEventHandler(AppendWorld); handler.Invoke(); } string[] message = new string[3]; public void AppendHello() { message[0] = "hello"; Console.WriteLine(message[0]); } public void AppendComma() { message[1] = ","; } public void AppendWorld() { message[2] = "World"; } //实现索引 public string this[int index] { get { return message[index]; } }
你发现去掉了那个FOREach去掉了invoke方法,去掉了LIST,这样简洁多了,要是单独论简洁的话,肯定匿名方法更加简洁,那么我们再改动下
public class InvokeList2 { //再次改进,利用匿名方法 string[] message = new string[3]; public InvokeList2() { StringAssignmentEventHandler handler = null; //handler += delegate { message[0] = "hello"; }; //handler += delegate { message[0] = ","; }; //handler += delegate { message[0] = "world"; }; //lamp handler += ()=>{ message[0] = "hello"; }; handler += () =>{ message[1] = ","; }; handler += () => { message[2] = "world"; }; handler.Invoke(); } //实现索引 public string this[int index] { get { return message[index]; } } }
呵呵,注销的是匿名方法,直接给出了lanm表达式的方式了,好,你懂了吧