发布时间:2023-06-05 19:30
其实我觉得委托这块还是挺难理解的,不过现在差不多明白了一些皮毛,我的理解是:委托不想做的事就命令,让其他方法(与委托参数列表以及返回值类型相同的方法)去做,做好了委托直接调用就行,其实受累的还是委托命令的方法,白干一场没得到啥好处,功劳还被委托拿走了。那么就让我们一起去看看吧!
**专业术语:**委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
委托类型表示对具有特定参数列表和返回类型的方法的引用。 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体
委托是引用类型,可以把它看作是用来存方法的一种类型。比如说类型string用来定义存取字符串的变量,那么委托类型delegate就可以用来定义存方法的变量。委托和类一样,是一种用户自定义类型。但类表示的是数据和方法的集合,而委托表示的是一个或多个方法的集合。你可以把delegate看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。
**注:**所有的委托都派生自 System.Delegate 类
delegate <返回值类型> <委托名称> <参数列表>;
//委托使用delegate关键字声明
例如:
delegate void Idext(int x,int c);
delegate string Idextion(double a);
**注:**一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有数值参数,而是方法名称,并且这个方法的签名返回值类型要和委托的一样。
例如:
Idext id1 = new Idext(p.Addnum1);
class DelegateApp//实例化的类
{
public delegate int Idext(int n);//声明一个委托叫Idext
int num = 10;//定义字段
//方法的返回值类型、参数列表要于委托相一致,可以说是方法签名一致
public int Addnum1(int p)
{
num += p;
return num;
}
public int Addnum2(int q)
{
num *= q;
return num;
}
public int getnum()
{
return num;
}
}
//外部调用
class Program
{
static void Main(string[] args)
{
//实例化对象
DelegateApp d = new DelegateApp();
//创建委托实例
Idext id1 = new Idext(d.Addnum1);
Idext id2 = new Idext(d.Addnum2);
//使用委托对象调用委托并传参
id1(20);
Console.WriteLine(\"值为{0}\", d.getnum());
id2(10);
Console.WriteLine(\"值为{0}\", d.getnum());
Console.ReadLine();
}
}
委托可以包含多个方法,这种委托称为多播委托,或组播委托。如果调用多播委托,就可以按顺序连续调用多个方法。为此委托的签名必须返回void,否则就只能得到委调用的最后一个方法的结果,也就是说想要调用连续的几个方法,那么他们的方法以及委托的返回值为void,否则为其他的,什么int、string就会得到最后一个方法返回的数数值。
多播委托可以使用运算符“+”和“+=”添加方法,也可以使用“-”和“-=”从委托中删除方法调用。
**委托多播实例:**小明叫小张买完车票后,就这又让它带张电影票
//小张类
class DelegateApp
{
public void BuyTicket()
{
//其实买车票的悲剧人物是小张
Console.WriteLine(\"NMD,每次都让人买火车票,鸡人呢!\");
}
public void BuyMovieTicket()
{
Console.WriteLine(\"卧槽,自己泡妞还要让我带电影票\");
}
}
//小明类
class Program
{
public delegate void Idext();//声明一个委托,其实就是命令
static void Main(string[] args)
{
DelegateApp d = new DelegateApp();
//创建委托实例
//这里就是具体阐述这个命令是干什么的,本例是d.BuyTicket“小张买火车票”
Idext id1 = new Idext(d.BuyTicket);
id1 += d.BuyMovieTicket;
//这时候委托被赋上的具体的方法
id1();
Console.ReadLine();
}
}
运行结果:
以上均为自己在一天的忙碌中学习并总结到的一些入门小知识,所以说今天收获颇多。也希望对你们能够有一定的帮助。如果文章有什么不完善的地方,或者数对大家造成了误导,还希望大家能够指出我i的错误,并且纠正我的错误,我期待和大家的进步,加油!