有两个问题: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)
{
}
}