C#委托初探
2014-01-02 09:29
232 查看
委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。您可以通过委托调用其中已添加的方法列表。委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。您可以创建一个自定义方法,当发生特定事件时某个类(例如 Windows 控件)就可以调用您的方法。button的单击事件发生后,通过委托这个管道找到用户添加的处理方法,从而执行方法;不必像之前win32程序那样循环等待某个事件消息。
先直接添端代码进来,
Tools类只是个工具,用来输出值至控制台,或者另起一行,停止控制台。
委托是最底层,事件是较上层,用来简化处理委托声明,封装维护调用列表。
View Code
总结性的比较少,代码比较多。因为我还没有完全领悟,只是初步了解了下。
具体大家可以发挥google的优势。
先直接添端代码进来,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test_Delegate { //定义一个委托,对应方法签名为 int Fun(int , int ) //编译器会自动生成一个委托类 dgOP,在此相当于声明一个类对象,稍后使用时new实例化 //继承链如:Delegate:MulticastDelegate:Delegate:ICloneable,ISerializable public delegate int dgOP(int x, int y); //生成的类形如 //sealed class dgOP : System.MulticastDelegate //{ // //构造函数,原理不清楚 !! // public dgOP(object target,unit functionAddr); // //成员函数,可在外调用 // public virtual int Invoke(int x, int y); // public virtual IAsyncResult BeginInvoke(int x, int y // , AsyncCallback callback, object @object); // public virtual int EndInvoke(IAsyncResult result); //} public class SimpleMath { /***********静态方法*******************/ public static int Add(int x, int y) { Console.WriteLine("add"); return x + y; } public static int Square(int x) { return x * x; } /***********动态方法*******************/ public int Sub(int x, int y) { Console.WriteLine("sub"); return x - y; } } class Program { static dgOP dg; static void Main(string[] args) { //静态方法 //实例化上文中定义的(编译器自动生成的)委托类,并指定方法 //+=内部隐式调用dgOP.Combine //Del(new dgOP(SimpleMath.Add)); dg = dgOP.Combine(new dgOP(SimpleMath.Add),new dgOP(new SimpleMath().Sub)) as dgOP; //执行调用列表的函数,但最终只返回最后一个函数调用返回值。 //dg(10 , 20)内部隐式调用 dg.Invoke(20 , 10) Tools.OutputParams(dg(10 , 20)); Tools.OutputParams(dg.Invoke(20, 10)); //DisplayDelegate(dg); Tools.NewLine(); ////动态方法 //SimpleMath m=new SimpleMath(); //dgOP dg2 = new dgOP(m.Sub); //Tools.OutputParams(dg2(10,20),dg2.Invoke(20,10)); //DisplayDelegate(dg2); ////委托已经声明为方法签名为:void Fun(int x,int y),对应2个参数 ////SimpleMath.Square只含一个参数 ////dgOP dg3 = new dgOP(SimpleMath.Square); Tools.Pause(); } private static void Del(dgOP dgOP) { dg += dgOP; } private static dgOP Del() { dgOP dg = new dgOP(SimpleMath.Add); dg += new dgOP(new SimpleMath().Sub); return dg; } private static void DisplayDelegate(dgOP dg) { //输出委托列表内部的方法签名,类对象 foreach (Delegate item in dg.GetInvocationList()) { Tools.OutputParams(item.Method, item.Target); } } } }
Tools类只是个工具,用来输出值至控制台,或者另起一行,停止控制台。
委托是最底层,事件是较上层,用来简化处理委托声明,封装维护调用列表。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleLambdaExpressions { class Program { static void Main(string[] args) { Console.WriteLine("***** Fun with Lambdas *****\n"); TraditionalDelegateSyntax(); AnonymousMethodSyntax(); Console.WriteLine(); LambdaExpressionSyntax(); Console.ReadLine(); } #region Traditional delegate syntax static void TraditionalDelegateSyntax() { // Make a list of integers. List<int> list = new List<int>(); list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 }); // Call FindAll() using traditional delegate syntax. Predicate<int> callback = new Predicate<int>(IsEvenNumber); List<int> evenNumbers = list.FindAll(callback); Console.WriteLine("Here are your even numbers:"); foreach (int evenNumber in evenNumbers) { Console.Write("{0}\t", evenNumber); } Console.WriteLine(); } // Target for the Predicate<> delegate. static bool IsEvenNumber(int i) { // Is it an even number? return (i % 2) == 0; } #endregion #region Anonymous method syntax static void AnonymousMethodSyntax() { // Make a list of integers using C# 3.0 // collection initialization syntax. List<int> list = new List<int>(); list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 }); List<int> evenNumbers = list.FindAll( delegate(int i) { return (i % 2) == 0; } ); Console.WriteLine("Here are your even numbers:"); foreach (int evenNumber in evenNumbers) { Console.Write("{0}\t", evenNumber); } Console.WriteLine(); } #endregion #region Lambda expression syntax static void LambdaExpressionSyntax() { // Make a list of integers. List<int> list = new List<int>(); list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 }); // Now process each argument within a group of // code statements. List<int> evenNumbers = list.FindAll((i) => { Console.WriteLine("value of i is currently: {0}", i); bool isEven = ((i % 2) == 0); return isEven; }); Console.WriteLine("Here are your even numbers:"); foreach (int evenNumber in evenNumbers) { Console.Write("{0}\t", evenNumber); } Console.WriteLine(); } #endregion } }
View Code
总结性的比较少,代码比较多。因为我还没有完全领悟,只是初步了解了下。
具体大家可以发挥google的优势。
相关文章推荐
- C#中 protected internal 和 internal 的区别
- C# WinForm下一步一步实现文件的拖入和拖出
- C#反射
- C#之你懂得的反射
- 从C# 2.0新特性到C# 3.5新特性
- c# 读取带有命名空间的XML
- C#实现类似qq的屏幕截图程序
- c#新语法学习笔记
- c# 线程中任务Task的实际运用
- C#中使用反射的优缺点
- 不可不知的C#基础 2. -–从 struct 和 class的异同
- (转)关于c#中的事件
- C#获取IP地址
- CSharp中索引器的简单使用
- AE+c#要素类,地理坐标系和投影坐标系的设置
- C#修改GIF大小同时保持GIF仍然可动和背景透明
- C#程序开机运行
- C#事件与委托详解【精华 多看看】
- C#中反射的用途
- C# 如何截取当前程序窗口的截图