C#语言进阶(一)—委托 第二篇

总目录
C# 语法总目录

委托 第二篇

委托 第二篇

4.实例对象方法、静态方法与委托之间的关系

  这里实例对象方法指的是 new 出来的一个对象,它的方法赋值给委托变量。委托变量不仅可以调用该方法,而且委托变量还能获取到这些对象方法所对应的对象。如果是静态方法赋值给委托变量,无法获取对应的对象,对象方法可以。

csharp 复制代码
namespace TopSet03
{
    public delegate void MethodTypeOfDelegate(int a);
    public class StaticMethodClass
    {
        public static void PrintSelf(int a)
        {
            Console.WriteLine("here is static method: "+a);
        }
    }

    public class NormalClass
    {
        public void PrintSelf(int a)
        {
            Console.WriteLine("here is normal method: " + a);
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MethodTypeOfDelegate? mt = null;

            NormalClass nc = new NormalClass();

            //可以获取到对象方法是来自哪一个类
            mt = nc.PrintSelf;
            Console.WriteLine((mt.Target==nc)+"   :"+mt.Method);

            //无法获取静态方法对应的类
            mt = StaticMethodClass.PrintSelf;
            Console.WriteLine(mt.Target == null);


            Console.ReadLine();
        }
    }
}

--输出
True   :Void PrintSelf(Int32)
True

5. 委托类型参数为泛型

这个和基本用法几乎一样,就是改个参数类型。

csharp 复制代码
namespace TopSet04
{
    public delegate T MethodTypeOfDelegate<T>(T a);

    internal class Program
    {
        static void Main(string[] args)
        {

            MethodTypeOfDelegate<int> mti = Mul;
            Console.WriteLine(mti(5));

            MethodTypeOfDelegate<float> mtf = Mulf;
            Console.WriteLine(mtf(3.0f));

            Console.ReadLine();
        }

        static int Mul(int a)
        {
            return a * a;
        }

        static float Mulf(float a)
        {
            return a * a;
        }
    }
}

--输出
25
9

6. System空间下的 Func 委托和 Action 委托

  Func和Action都是委托类型为参数的委托,是System提供的。

  Func委托最后一个泛型类型必须是传出类型而且该委托的返回值必须是传出类型,即必须添加 out 标识符,如果只有一个泛型参数,那么这个泛型必须是 传出类型。

  Action委托是返回值为空的,参数是泛型的委托。

csharp 复制代码
namespace TopSet05
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Action<int, int> a = Add;
            a(1, 2);

            Func<int, int, int> f = Dec;
            Console.WriteLine(f(2,1));
        }

        //Action类型
        static void Add(int a,int b)
        {
            Console.WriteLine(a+b);
        }

        //Func类型,返回值为int
        static int Dec(int a,int b)
        {
            return a - b;
        }
    }

}

总目录
C# 语法总目录

相关推荐
kyle~1 小时前
C++_STL---迭代器失效
开发语言·c++
Brilliantwxx2 小时前
【C语言】 初入嵌入式C语言复习(基础+进阶面试题)
c语言·开发语言
熊野君2 小时前
附录与 Codex 实操手册
开发语言·人工智能·产品经理
XZ-0700013 小时前
week2-1-可视化
开发语言·python
Java后端的Ai之路4 小时前
14、Python - 责任链模式
服务器·开发语言·人工智能·python·责任链模式
吴声子夜歌4 小时前
Java——基本类型
java·开发语言
「QT(C++)开发工程师」4 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
不正经学生4 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
AI情绪识别开源5 小时前
检信AI高一分班分科智选评估系统 v2.0测试报告
开发语言·数据结构·人工智能·科技
纯.Pure_Jin(g)5 小时前
靶场PHP函数整理+防御方式
开发语言·php·ctf