委托

1..net 委托类型用来定义和响应程序中的回调。.net委托类型是一个类型安全的对象,指向可以以后调用的其他方法。.net委托是内置支持多路广播和异步方法调用的对象。同时lamabda表达式只是匿名方法的一种,提供了一种简单的方式来使用委托。.net委托中的委托(包括自定义)都被自动赋予同步或异步访问方法的能力,可以不用手工创建与管理一个Thread对象而直接调用另一个辅助执行线程上的方法。


2.委托定义

 public delegate int Func1(int x, int y);  //该委托可以指向任何传入两个整数,返回一个整数的方法。

......

 public class MyClass10
    {        

private void TestFunc()
        {
            Func1 c = new Func1(add);  
            c(1, 2);  //使用委托对象间接调用add方法

        }


        private static int add(int x, int y)
        {
            return x + y;
        }
    }

3.当C#编译器处理委托类型的时候,它先自动产生一个派生自System.MulticastDelegate的密封类。这个类与他的基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用方法的列表。

4.委托将生成3个公共方法

Invoke()  //已同步方式调用委托对象维护的方法列表中的方法。这里调用这必须等待调用完成才能继续执行。

BeginInvoke() 和 EndInvoke()  //在第二个执行线程上异步调用当前的方法。

 public delegate int Func1(int x, int y);该委托将生成类似下面三个方法

public sealed class Func1:System.MulticastDelegate

{

public int Invoke(int x, int y);

public IAsyncResult BeginInvoke(int x, int y, AsynCallback cb, ojbect state);

public int EndInvoke(IAsyncResult result);

}

委托可以包含任意数量的out和ref参数以及用params关键字标记的数组参数。


5.基类MulticastDelegate和Delegate所包含的部分成员

Delegate对象代表一个可调用的特定方法,其属性Method:用以表示委托维护的静态方法的详细信息

属性Target:用以表示对象级别方法的所属对象,如果静态方法,则为null

Combine():  +=

Remove() :  +=

RemoveAll() :移除所有方法

GetInvocationList(): MulticastDelegate中,返回System.Delegate数组。


6.多路广播

 public class MyClass1
    {
        public delegate int FuncTest(int x, int y);  //将委托定义在使用他的类型的作用域里
        private FuncTest Func1 = null;
        public void RegiterFunc1(FuncTest FuncHandle)
        {
            //if (Func1 == null)
            //    Func1 = FuncHandle;
            //else
            //    Delegate.Combine(Func1, FuncHandle);
            Func1 += FuncHandle;  //等同于上面
        }
        public int Func2(int x, int y)
        {
            if (Func1 != null)
            {
                int i = Func1(x, y);  //这里的返回值是列表中的最后的一个注册的的返回值。这里结果为:12,3                
                return i;
            }
            Console.WriteLine("list is null...");
            return 0;
        }


        internal void UnRegisterFunc1(FuncTest func)
        {
            Func1 -= func;
        }
    }

    public class MyClass2
    {
        public void Fun1()
        {
            MyClass1 cls1 = new MyClass1();
            cls1.RegiterFunc1(new MyClass1.FuncTest(Func2));  //这里也可以使用方法组转换(通常使用的),  cls1.RegiterFunc1(Func3);
            MyClass1.FuncTest func3 = new MyClass1.FuncTest(Func3);
            cls1.RegiterFunc1(func3);
            cls1.Func2(8, 4);
            cls1.UnRegisterFunc1(func3);  //动态的注销委托通知
            cls1.Func2(5, 2);
        }
        private int Func3(int x, int y)
        {
            int i = x + y;
            Console.WriteLine(i);
            return x + y;
        }


        private int Func2(int x, int y)
        {
            int i = x - y;
            Console.WriteLine(i);
            return x - y;
        }
    }

最后的结果为:4,12,3


7.泛型委托

public delegate void DeleTest<T>(T obj);
    public class MyClass3
    {
        
        public void Func1()
        {
            DeleTest<int> deleInt = new DeleTest<int>(Func3);
            deleInt(3);
            DeleTest<string> deleString = new DeleTest<string>(Func4);
            deleString("<T>Testing...");

        }
     
        public void Func3(int x)
        {
            Console.WriteLine(x);
        }
        public void Func4(string x)
        {
            Console.WriteLine(x);
        }
    }


8.框架内置泛型委托Action<>和Func<>

一.Action<>无返回值泛型委托、Func<>有返回值的委托。

二..示例

public class MyClass4
    {
        private void Func1()
        {
            Action<int, int> ShowResult = new Action<int, int>(ShowResultStr);
            ShowResult(2, 2);
            Func<int, int, int> ShowInt = new Func<int, int, int>(ReturnInt);
            int result = ShowInt(3, 4);

        }


        public void ShowResultStr(int x, int y)
        {
            Console.WriteLine(x + y);
        }
        public int ReturnInt(int x, int y)
        {
            Console.WriteLine(x + y);
            return x + y;
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值