委托深入学习

有两个问题:1. 用什么方法或工具来重新MulticasetDelegate???

                  2. 委托的协变和抗变表现的是多态特性吗??它的主要应用是什么呢??

委托:运行时动态的指定执行某代码块。

delegate void RunDelegate(int x);
定义了一个委托,此委托的每个实例包含方法的细节:返回值为空,参数为int型。
假定一个委托TurnDelegate,该委托代表的方法有两个long型参数,返回类型为double。
deleget double TurnDelegate(long direction,long speed);
理解委托:定义委托就是定义一个类,委托就是方法的一个参数签名和返回类型指定。
委托实现为派生自基类System.MulticastDelegate-->System.Delegate。在mscorlib.dll-->System-->Delegate-->MulticastDelegate。
public delegate string TestDelegate();
static void Main(string[] args)
{
     int a = 100;//定义一个int类型的变量
     TestDelegate test = new TestDelegate(a.ToString);//将int的ToString方法包含在TestDelegate中
     Console.WriteLine("String is {0}", test.Invoke());//调用委托方法 test.Invoke(); test();
     Console.ReadLine();
}

多播委托
我的理解就是为委托类指定了多个代码块,委托类像指针那样指向代码块,按照指定的顺序进行代码块的执行。
如:DemoDelegate demo = Function1;
    demo += Function2;
    demo += Function3;

    class Program
    {
        delegate void DemoDelegate();
        static void Main(string[] args)
        {
            DemoDelegate demo = Test.Function1;
            demo += Test.Function2;
            demo += Test.Function3;

            demo();
            Console.ReadLine();
        }
    }

    public class Test
    {
        public static void Function1()
        {
            Console.WriteLine("Function 1 ");
        }
        public static void Function2()
        {
            Console.WriteLine("Function 2 ");
        }
        public static void Function3()
        {
            Console.WriteLine("Function 3 ");
        }
    }

但是如果中间的代码块发生异常,则下面的代码块将不继续执行了。
实际上委托中包含一个委托类型的集合Delegate[],通过GetInvocationList获得。
如demo.GetInvocationList();
  通过for{ try{...} catch{...} }来进行循环调用。

匿名委托 匿名委托之 Lambda(λ)表达式
    delegate string DemoDelegate(string name,int age);
        static void Main(string[] args)
        {
            //匿名委托
            DemoDelegate demo = delegate(string name,int age)
            {
                TestDelegate(100, 5);
                return "Hello " + name + "," + age + " ,Welcome To Dead House!";
            };
            Console.WriteLine(demo("Jeffres",100));

            //匿名委托之 Lambda(λ)表达式
            DemoDelegate demolambda = (name,age)=>
            {
                return "你好 " + name + "," + age + " ,欢迎你!";
            };
            Console.WriteLine(demolambda("Beyond",50));
 
            Console.ReadLine();
        }
        public static void TestDelegate(int x,int y)
        {
            Console.WriteLine(x + y);
        }

返回类型协变:方法的返回类型可以派生于委托定义的类型。
public class ReturnUp
{}
public class ReturnDown:ReturnUp
{}
public delegate ReturnUp DemoDelegate();
class Program
{
    static void Main()
    {
        DemoDelegate demo = Method;
        demo();
    }
    static ReturnDown Method()
    {
        ReturnDown down = new ReturnDown();
        return down;
    }
}

参数类型抗变:委托定义的参数可能不同于委托调用的方法。
public class ParamUp
{}
public class ParamDown:ParamUp
{}
public delegate void DemoDelegate(ParamDown param);
class Program
{
    static void Main()
    {
    DemoDelegate demo = Method;
    ParamDown p = new ParamDown();
    demo(p);
    }
    static void Method(ParamUp p)
    {
    
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值