一.普通模式:
#region 模式1 public Form1() { InitializeComponent(); GetProcessByJudge(); } public bool MemoryCountJudge(ProcessClass cl) { if (cl.MemoryCount > 24 * 1024) { return true; } return false; } public void GetProcessByJudge() { Process[] processArray = Process.GetProcesses(); List<ProcessClass> result = new List<ProcessClass>(); foreach (Process item in processArray) { result.Add(new ProcessClass(item.Id, item.ProcessName, item.WorkingSet64)); } //Show foreach (ProcessClass item in result) { if (MemoryCountJudge(item)) { textBox1.Text += string.Format("ID:{0},Name:{1},Size:{2}", item.ID, item.ProcessName, item.MemoryCount) + Environment.NewLine; } } } #endregion
二.委托模式
#region 模式2 public delegate bool MemoryCountJudgeDelegate(ProcessClass cl); MemoryCountJudgeDelegate del = null; public Form1() { InitializeComponent(); del = new MemoryCountJudgeDelegate(MemoryCountJudge); GetProcessByJudge(); } public bool MemoryCountJudge(ProcessClass cl) { if (cl.MemoryCount > 24 * 1024) { return true; } return false; } public void GetProcessByJudge() { Process[] processArray = Process.GetProcesses(); List<ProcessClass> result = new List<ProcessClass>(); foreach (Process item in processArray) { result.Add(new ProcessClass(item.Id, item.ProcessName, item.WorkingSet64)); } //Show foreach (ProcessClass item in result) { if (del(item)) { textBox1.Text += string.Format("ID:{0},Name:{1},Size:{2}", item.ID, item.ProcessName, item.MemoryCount) + Environment.NewLine; } } } #endregion
三.Lambda与匿名委托
public Form1() { InitializeComponent(); GetProcessByJudge(); } Func<ProcessClass, bool> func = instance => { if (instance.MemoryCount > 24 * 1024) { return true; } return false; }; public void GetProcessByJudge() { Process[] processArray = Process.GetProcesses(); List<ProcessClass> result = new List<ProcessClass>(); foreach (Process item in processArray) { result.Add(new ProcessClass(item.Id, item.ProcessName, item.WorkingSet64)); } //Show foreach (ProcessClass item in result) { if (func(item)) { textBox1.Text += string.Format("ID:{0},Name:{1},Size:{2}", item.ID, item.ProcessName, item.MemoryCount) + Environment.NewLine; } } }
四.Lambda与匿名委托的改进
public Form1() { InitializeComponent(); GetProcessByJudge(instance => { if (instance.MemoryCount > 24 * 1024) { return true; } return false; }); } public void GetProcessByJudge(Func<ProcessClass, bool> func) { Process[] processArray = Process.GetProcesses(); List<ProcessClass> result = new List<ProcessClass>(); foreach (Process item in processArray) { result.Add(new ProcessClass(item.Id, item.ProcessName, item.WorkingSet64)); } //Show foreach (ProcessClass item in result) { if (func(item)) { textBox1.Text += string.Format("ID:{0},Name:{1},Size:{2}", item.ID, item.ProcessName, item.MemoryCount) + Environment.NewLine; } } }
四种代码:执行效果
总结: 1.委托其实就是方法的指针,任何方法均可转化为委托,然后调用委托来执行方法。虽说在这里看到代码量增多,但是真正的用处在构建复杂系统或搭建ORM时,将产生巨大作用。
2.系统提供了Action和Func两种匿名委托,Action是不需要返回结果值,Func需要返回结果值。在这里,我们可以不用建立自己的委托,调用匿名委托即可。
3.结合Lambda表达式和委托的兼容性,将语句方法体 用Lambda表达式来转换,达到简化代码的目的。