委托

本文介绍了C#中的委托概念,包括其定义、声明及使用方法。详细解释了如何定义委托、创建委托实例,以及如何将委托作为参数传递。此外,还介绍了系统内置的Action和Func委托类型及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

委托的定义和声明

1、委托是一种存储函数引用的类型,关键字是delegate
2、委托的定义指定了一个返回类型和一个参数列表

namespace _004
{
    //委托和函数的区别
    //1、定义委托要加上关键字delegate
    //2、委托不需要函数体
    public delegate double MyDelegate(double param1, double param2);
    class Program
    {
        static double Multiply(double param1,double param2)
        {
            return param1 * param2;
        }
        static double Divide(double param1,double param2)
        {
            return param1 / param2;
        }
        static void Main(string[] args)
        {
            MyDelegate de;//利用我们定义的委托类型声明了一个变量
            MyDelegate MD;
            MD = Divide;
            de = Multiply;
            Console.WriteLine( de(2.0, 555.46)+"  "+MD(464,445));

            Console.ReadKey();
        }
    }
}

委托

概念:委托是一个类型,这个类型可以赋值一个方法的引用

声明委托

在c#中使用委托需要两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后创建该委托的实例,定义委托的语法如下:
delegate void IntMethodInvoker(int x)
表示定义一个委托叫做IntMethodInvoker,这个方法带有一个类型的参数,并且这个方法的返回值是void,定义一个委托要定义方法的参数和返回值,使用关键字delegate定义。
例:

class Program
{
   private delegate string GetAString();//指向一个参数为空,返回值为String的方法
   static void Main(){
           int x=40;
           GetAString firstStringMethod=new GetAString(x.ToString);//ToString表示把x的值转换成一个字符串a指向了x中的ToString方法
            Console.WriteLine(firstStringMethod());
  }
}

在这里我们首先使用GetAString委托声明了一个类型,叫做firstStringMethod,接下来使用new对他进行初始化,使他引用到x中的ToString方法上,这样firstStringMethod就相当于x.ToString,我们通过firstStringMethod()执行方法就相当于x.ToString()

class Program{
private delegate string GetAString();
static void Main(){
int x-40;
GetAString a=x.ToString;
string s=a.Invoke();//通过invoke方法调用a中所引用的方法
Console.WriteLine(s);

把委托类型当做参数使用

private delegate void PrintString();
static void PrintStr(PrintString print)
{
print();
}
static void Method1(){
Console.WriteLine("method1");
}
static void Method2(){
Console.WriteLine("method");
}
static void Main(){
PrintString method=Method1;
PrintStr(method);
method=Method2;
PrintStr(method);

Action委托

除了我们自己定义的委托外,系统还给我们提供了一个内置的委托类型,Action和Func
Action 是一个没有返回值和参数的委托。注:当我们需要定义一个没有返回值没有参数的委托时,可以直接调用Action委托,省去我们手动定义委托的麻烦
例:

class Program{
static void PrintString()
{
Console.WriteLine("Action委托");
}
static void Main(string[] args){
Action a=PrintString;//action委托是系统内置(预定义)的一个委托类型,他可以指向一个没有返回值没有参数的方法
}
}

Action也可以指向有参数但没有返回值的委托类型
例:

Action<int> a;//定义一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法
class Program{
static void PrintInt(int i){
Console.writeLine("Hollo,Word");
}
static void Main(string[] args){
Action<int> a=PrintInt;
}

当有两个参数类型时
例:

static void PrintDoubleInt(int i1,int i2){
Console.WriteLine(i1+i2);
}
static void Main(string[] args)
{
Action<int,int> a=PrintDoubleInt;
a(22,12);//调用
}

Action最大支持16个参数

Func委托

Func引用了一个带有返回值的方法,他可以传递0或者多到16个参数类型和一个返回值类型
例:

class Program{
static int Test1()
{
    return 1;
}
static void Main(string[] args)
{
Func<int> a=Test1;
Console.WriteLine(a());
 }
}

例2:

class Program
{
static int Test2(string str)
{
Console.WriteLine(str);
return 100;
}
static void Main(string[] args)
{
Func<string,int> a=Test2;//后面的表示返回值类型,前面的表示参数类型
}
}

Function后面可以跟很多类型,最后一个类型时返回值类型,前面的类型时参数类型,参数类型必须跟指向的方法的参数类型按照顺序对应
Function后面必须指定一个返回值类型,参数类型可以有0-16个,先写参数类型,最后一个写返回值类型

多播委托

class Program{
static void Test1()
{
Console.WriteLine("text1");
}
static void Test2()
{
Console.WriteLine("test2");
}
static void Main(string[] args)
{
Action a=Test1;
a+=Test2;//表示添加一个委托的引用
a-=Test1;//表示去除一个委托的引用
a();

当一个委托没有指向任何方法的时候,调用的话会出现异常

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小温同学的账号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值