コード例 #1
0
ファイル: Program.cs プロジェクト: MalkavianMa/FirstWorld
        //1委托类似于C++函数指针,,但它是类型安全的.
        //2委托允许将方法作为参数进行传递
        //3委托可用于定义回调方法
        //4委托可以链接在一起;;例如,,可以对一个事件调用多个方法
        //5方法不需要与委托签名精确匹配
        static void Main(string[] args)
        {    //构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法..实例化委托后,委托将把对它进行的方法调用传递给方法
            //来自方法的返回值(如果有)由委托返回给调用方,,这称为调用委托..
            //可以将一个实例化的委托视为被包装的方法本身来调用该委托 eg:
            Program sl = new Program();
            Jisuan  js = sl.multiplication; //实例化委托Jisuan

            js(8, 8);                       //调用委托
            sl.NumJs = js(8, 100);          //委托的很好理解
            //   Console.WriteLine(sl.NumJs);
            //   string key=   Console.ReadKey(true).Key.ToString ();//readkey 使用不是很理解
            //  Console.WriteLine(key);
            //  Console.ReadLine();

            //调用JiSuanCallBack方法,并把前面定义的Jisuan委托的实例js传递给该方法
            sl.Cb = sl.JiSuanCallBack(9, 9, js);

            JiSuanClass jsc = new JiSuanClass();
            Jisuan      js1 = jsc.He;
            Jisuan      js2 = jsc.Shang;
            Jisuan      js3 = sl.multiplication;
//调用委托时,,它可以调用多个方法,,,这称为多路广播..若要向委托的方法列表(调用列表)中添加额外的方法
//只需要使用加法运算符或加法赋值运算符("+"或"+=")添加委托..eg:
            Jisuan jsa = js1 + js2;

            jsa += js3;
            //此时,jsa在调用列表中包含三个方法:multiplication,He,Shang,,原来的三个委托js1,js2,js3保持不变..调用jsa时
            //,,将按顺序调用所有这三个方法..如果委托使用引用参数,,则引用将依次传递给三个方法中的每个方法..
            //由一个方法引起的更改对下一个方法是可见的..如果任一方法引发了异常,,而在该方法内未捕获异常,,
            //则该异常将传递给委托的调用方,,并且不再对调用列表中后面的方法进行调用..如果委托具有返回值/或输出参数,它将
            //返回最后调用的方法的返回值和参数..若要从调用列表中移除方法,,请使用减法运算符或减法赋值运算符("-","-=")./eg:

            jsa -= js1;
            int    numJ = jsa(12, 6);//为了证明以上结论,.及调用顺序,,返回是否覆盖
            Jisuan js4;

            js4 = jsa - js2;
            //由于委托类派生自System.Delegate,,所以可在委托上调用该类定义的方法和属性..eg:
            //为了找出委托的调用列表中的方法数,,可以编写下面的代码:
            int Number = jsa.GetInvocationList().GetLength(0);
            //多路广播委托广泛用于事件处理中..事件源对象向已注册接收该事件的接收方对象发送事件通知..
            //为了为事件注册,,接收方创建了旨在处理事件的方法
            //然后为该方法创建委托并将该委托传递给事件源
            //事件发生时,,源将调用委托,,然后,,委托调用接收方的事件处理方法并传送事件数据
            //给定事件的委托类型由事件源定义
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: MalkavianMa/FirstWorld
 //委托类型派生字.NET Framework中的Delegate类..委托类型是密封的,,不能从Delegate中派生委托类型,,也不可能从中派生自定义类.
 //由于实例化委托是一个对象,,所以可以将其作为参数进行传递,也可以将其赋值给属性.
 //这样,,方法便可以将一个委托作为参数来接受,,并且以后可以调用该委托,,这称为异步回调,,
 //是在较长的进程完成后用来通知调用方的常用方法..
 //以这种方式使用委托时,,使用委托的代码无需了解所用方法的实现方面的任何信息..此功能类似于接口所提供的封装..
 //回调的另一个常见用法是定义自定义的比较方法,,并将该委托传递给排序方法..他允许调用方的代码
 //成为排序算法的一部分.,,.例如定义一个方法,该方法包含一个参数为前面定义的委托,,代码如下:
 public int JiSuanCallBack(int one, int two, Jisuan js)
 {
     return(js(one, two));
 }