委托:委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全
相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值。
与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可
与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可
以分配给该委托。方法可以是静态方法,也可以是实例方法。这样就可以通过编程方式
来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,便可以分配自
己的委托方法。
特点:
委托类似于 C++ 函数指针,但它们是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不必与委托签名完全匹配。
委托也可以用在匿名方法上
例如:
delegate void delg(int i);//在类外部定义一个委
在main方法里委托引用了一个匿名方法
delg del1 = delegate(int i) { Console.Write("method4: ");
委托类似于 C++ 函数指针,但它们是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不必与委托签名完全匹配。
委托也可以用在匿名方法上
例如:
delegate void delg(int i);//在类外部定义一个委
在main方法里委托引用了一个匿名方法
delg del1 = delegate(int i) { Console.Write("method4: ");
Console.WriteLine(i); };
委托的协变:
(例子中解释)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
(例子中解释)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace text0725lianxi
{
class Program
{
static void Main(string[] args)
{
Program pro=new Program();
del del1 = new del(pro.meth1);
del del2 = new del(pro.meth2);/*委托的协变
{
class Program
{
static void Main(string[] args)
{
Program pro=new Program();
del del1 = new del(pro.meth1);
del del2 = new del(pro.meth2);/*委托的协变
(meth2的返回值是minicom型,
del2的返回值是computer类型,
computer是minicom的父类型,
可以把子类型的值赋给父类型)*/
del2的返回值是computer类型,
computer是minicom的父类型,
可以把子类型的值赋给父类型)*/
Console.WriteLine(del1().GetType().ToString());
//执行出来是text0725lianxi.computer
Console.WriteLine(del2().GetType().ToString());
Console.WriteLine(del2().GetType().ToString());
//执行出来是text0725lianxi.minicom
}
public computer meth1() //返回值为computer类型的方法
{
return new computer();
}
public minicom meth2() //返回值为minicom类型的方法
{
return new minicom();
}
}
class computer //定义computer类
{ }
class minicom : computer //定义minicom类,继承自computer类
{ }
delegate computer del(); //定义返回值为computer类型的委托
}
public computer meth1() //返回值为computer类型的方法
{
return new computer();
}
public minicom meth2() //返回值为minicom类型的方法
{
return new minicom();
}
}
class computer //定义computer类
{ }
class minicom : computer //定义minicom类,继承自computer类
{ }
delegate computer del(); //定义返回值为computer类型的委托
}
委托的逆变:
(例子中解释)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
(例子中解释)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace text0725lianxi
{
class computer //定义一个computer类
{ }
class minicom : computer //定义一个minicom类,这个类继承自computer
{ }
delegate void del(minicom com); //定义一个委托,他的参数是minicom类型
class Program
{
static void Main(string[] args)
{
Program pro = new Program();
minicom com=new minicom();
del del1 = new del(pro.meth1);//委托的逆变:
/* 委托del1引用了meth1方法,
委托的参数是minicom类型
meth1方法的参数是computer类型
这样好像是把一个父类型付给了子类型
* 但实际上是参数的传递并不在这行代码
* 中进行,而在后面del1(com)中进行,
* minicom类型的参数先传给del1,但del1
* 仅仅是个委托,他引用的是方法meth1,
* 这样参数继续传递给方法meth1, 而
* meth1方法需要的参数是computer类型,
* 这个时候就是把子类型 参数赋给了父类
* 型,是允许的,这个过程就是委托的逆变 */
{
class computer //定义一个computer类
{ }
class minicom : computer //定义一个minicom类,这个类继承自computer
{ }
delegate void del(minicom com); //定义一个委托,他的参数是minicom类型
class Program
{
static void Main(string[] args)
{
Program pro = new Program();
minicom com=new minicom();
del del1 = new del(pro.meth1);//委托的逆变:
/* 委托del1引用了meth1方法,
委托的参数是minicom类型
meth1方法的参数是computer类型
这样好像是把一个父类型付给了子类型
* 但实际上是参数的传递并不在这行代码
* 中进行,而在后面del1(com)中进行,
* minicom类型的参数先传给del1,但del1
* 仅仅是个委托,他引用的是方法meth1,
* 这样参数继续传递给方法meth1, 而
* meth1方法需要的参数是computer类型,
* 这个时候就是把子类型 参数赋给了父类
* 型,是允许的,这个过程就是委托的逆变 */
del del2 = new del(pro.meth2);
del1(com);
//del2(pu);
del2(com);
}
public void meth1(computer com) //定义一个参数为computer类型的方法
{
Console.WriteLine("meth1");
}
public void meth2(minicom com) //定义一个参数为minicom类型的方法
{
Console.WriteLine("meth2");
}
}
del1(com);
//del2(pu);
del2(com);
}
public void meth1(computer com) //定义一个参数为computer类型的方法
{
Console.WriteLine("meth1");
}
public void meth2(minicom com) //定义一个参数为minicom类型的方法
{
Console.WriteLine("meth2");
}
}
}
转载于:https://blog.51cto.com/mydotnet/360584