c#中的委托:(Delegate)委托的声明是在我们的修饰符后面加上delegate就可以了,委托的写法和方法差不多,其调用的方式和方法也是差不多的,都是可以给满足他的条件就可以调用,委托的实例化也是使用new来实例化的但是我们传递到进去的语句是要传递同一个类型的值的方法进去的而不是直接传递参数,
using System;
delegate int Wt(int a);
namespace _2022_7_18_wt
{
class Program
{
static int b = 10;
public static int Ffa(int a_1)
{
a_1 += b;
return a_1;
}
public static int Ffb(int a_2)
{
a_2*= b;
return a_2;
}
static void Main(string[] args)
{
Wt wt = new Wt(Ffa);
Wt wta = new Wt(Ffb);
wt(25);
wta(5);
Console.WriteLine("委托的第一个方法{0}", wt(25));
Console.WriteLine("委托的第二个方法{0}", wta(5));
Console.ReadKey();
}
}
}
我们看到我们对委托的使用,在实例化委托后传入其对应数值类型的方法来实现委托的完成意思是不管这种方法有多少和其方法的内容是什么只要是数值类型是正确的就可以用委托来调用比较的方便和容易统一管理
委托的多播: 有点类似方法的叠加,一个方法实现可以让他叠加多个方法,来实现他多个方法的实现,在我们委托里是使用“+”法来实现合并的用”-“法来去掉不用的委托
using System;
delegate int Wt(int a);
namespace _2022_7_18_wt
{
class Program
{
static int b = 10;
public static int Ffa(int a_1)
{
b+=a_1;
return b;
}
public static int Ffb(int a_2)
{
b *= a_2;
return b;
}
public static int Ffc(int a_3)
{
b += a_3;
b *= a_3;
return b;
}
static void Main(string[] args)
{
Wt wt;
Wt wta = new Wt(Ffa);
Wt wtb = new Wt(Ffb);
Wt wtc = new Wt(Ffc);
wt = wta;
wt += wtb;
wt += wtc;
int d= wt(5);
Console.WriteLine("委托的多播方法{0}", d);
Console.ReadKey();
}
}
}
我们看到我们在后面用一个委托添加三个委托,给一个委托赋值实现三个委托的同时调用,这就是委托的多播,是可以一次性使用多个委托方法
下面我根据自己的理解写一个委托使用来看看委托的一些用法
我写的是一个商品打折的方法,当商品满足什么条件时打什么折并用到我们的委托的多播
using System;
namespace _2022_7_18_wt2
{
delegate double Djb(double a);
class Program
{
public static bool pd = true;
public static double zj;
public static double Xing(double a)
{
if(a>=50&&a<=100)
{
zj = a * 0.8;
Console.WriteLine("你买的商品已经打折,折后价为{0}", zj);
return zj;
}
else
{
zj = a;
if(a>100)
{
Console.WriteLine("你买的商品已经打了一次折,可以进行二次打折");
}
if(a<50)
{
Console.WriteLine("你买商品价格没有达到一次打折的效果");
}
return zj;
}
}
public static double Sg(double a)
{
if(a>100&&a<=200)
{
double c=a - 100;
double d = 100 * 0.8;
c = c * 0.7;
zj = d + c;
Console.WriteLine("你买的商品已经打折,折后价为{0}", zj);
return c;
}
else
{
zj = a;
if(a>200)
{
Console.WriteLine("你买的商品已经打了二次折,可以进行三次打折");
}
return zj;
}
}
public static double Tz(double a)
{
if (a > 200)
{
double e = 100 * 0.8;
double f = 100 * 0.7;
double g = a-200;
g = g * 0.6;
zj = e + g + f;
Console.WriteLine("你买的商品已经打完最后折,折后价为{0}", zj);
return zj;
}
else
{
zj = a;
return zj;
}
}
static void Main(string[] args)
{
Djb djba;
Djb djb = new Djb(Xing);
Djb djb1 = new Djb(Sg);
Djb djb2 = new Djb(Tz);
djba = djb;
djba += djb1;
djba += djb2;
for (int i = 0; i <100; i++)
{
Console.WriteLine("请输入你买的商品价格");
zj = Convert.ToInt64(Console.ReadLine());
djba(zj);
}
}
}
}