C# 委托详解

1. 委托的定义和理解

C#中,委托和class一样 ,是一种引用类型的数据类型,可以用来声明变量。使用的时候则需要创建实例。(关于委托对于引用类型的理解:表示对具有特定参数列表和返回类型的方法的引用(不理解也没关系)

委托一般定义在命名空间中,和class一样, 也可以定义在类中,就是该类的属性。

java语言和c#语言都是c++语言发展而来,但是java语言为了安全性,不允许程序员直接访问地址,舍弃了与指针相关的东西,但是c#语言却通过委托来保留了与函数指针这部分对应的功能 。这也是为什么那么多人解释说委托可以理解为函数指针。

自己声明定义委托并使用

声明示例:

    public delegate void MyDelegate(); //无返回值类型,无参数
    public delegate string MyTest(string parm); //返回值 string类型,参数 string类型

写一个类,里面包含函数Method1,Method2 ,用来测试委托

    public class DelegateTest
    {
        public void Method()
        {
            Console.WriteLine("这是没有返回值的方法!");
        }

        public string Method2(string name)
        {
            string  result= "fanhuizhi" + name;
            Console.WriteLine($"这是有返回值,有参数的方法,返回值为{result},传入的参数为{name}");
            return result;
        }
    }

main函数中调用

测试结果

2.  C#中常使用的委托和自定义委托

和class类相似,C#中有很多已经定义好的类,方便直接使用,比方说和线程相关的Task类,

关于委托,C#中也有已经定义好的,最常见的是Action和Func ,

Action委托 没有返回值类型;  Func 委托,是泛型委托, <>中存放返回值类型

和上面自己定义一样,一般情况下最常用的有无返回值,以及参数个数有多少,基本上Action和Func都能满足,有自己的其它需求可以考虑自定义。

ACtion和Func的定义 ,仅做了解

F12查看 Action的定义 ,

Func的定义

注: public delegate TResult Func<out TResult>();  其中TResult表示的是泛型参数,而out TResult表示可以输出泛型

解释 Func<out TResult>

  • public delegate:这是一个委托声明的开始,表明 Func 是一个委托类型。
  • <TResult>:这是泛型类型参数的声明。TResult 是一个泛型参数,它代表委托返回值的类型。使用泛型参数可以让你定义一个可以返回任何类型结果的委托。
  • out:在泛型委托或泛型方法中,out 关键字用于方法参数,表示该参数是输出参数,即方法执行完毕后,该参数会被赋予一个值。但在泛型类型参数声明中,out 关键字没有特殊含义,它只是类型参数的名称。
  • Func<out TResult>():括号表示该委托可以绑定无参数的方法。

关于Func和Action的使用 示例:

1. Action 委托

    public class Calculate
    {
        public void Report()
        {
            Console.WriteLine("there are three methods!");
        }

        public double Add(double a, double b)
        {
            Console.WriteLine("sum =" + (a + b));
            return a + b;
        }

        public double Del(double a, double b)
        {
            Console.WriteLine("del =" + (a - b));
            return a - b;
        }

        public double Method()
        {
            return 3;
        }
        public void Method1()
        {
            Console.WriteLine("委托函数测试1");
        }

        public void Method2()
        {
            Console.WriteLine("委托函数测试2");
        }

        public void Method3(double x)
        {
            Console.WriteLine($"输入的double类型参数为{x}");
        }
    }

测试,调用

测试结果

 2. Func委托

测试结果:

3. 多播委托

测试结果

委托的很粗糙的 通过敲掉代码的方式理解这个概念,  至于一下问题,后续理解后再更细:
1. 既然可以用类的实例直接调用方法的方式实现方法的调用,为什么还需要使用委托?

2. 在什么情况下需要使用委托?

3.为什么说 委托是事件和回调函数的基础?
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值