• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

10月
19
C#

委托

发表于 2021-10-19 • 字数统计 3377 • 被 1,449 人看爆

委托

概念

1.存储函数引用的类型,是一种用户自定义的类型
2.委托储存具有相同返回类型和相同参数的任何类或结构
用处:如:发布订阅模式,事件等。

与类的区别

同:都是一种用户自定的类型
异:
    类:表示的是数据和方法的集合
    委托:持有一个或多个方法,以及一系列预定义操作,没有方法主体

声明

关键字:delegate
委托类型必须在被用来创建变量以及类型的对象之前声明
    delegate void MyDel(int x);

实例

namespace Func
{   
    public delegate void MyDel();//声明一个自定义委托
    class Program
    {
        static void Main(string[] args)
        {
            MyDel say1 = SayHi;
            MyDel say2 = new MyDel(SayHi);
            say1();
            say2();
        }
        static void SayHi()
        {
            Console.WriteLine("hi");
        }
    }
}

扩展实例

namespace Func
{
    public delegate int MyDel(int num);//声明一个自定义委托0
    class Program
    {
        static int Add1(int a)
        {
            int b = 10 + a;
            Console.WriteLine("——Add1———");
            return b;
 
        }
 
        static int Add2(int a)
        {
            int b = 10 - a;
            Console.WriteLine("——Add2———");
            return b;
 
        }
 
        static void Calculate(MyDel ex, int a)
        {
            var result = ex(a);
            Console.WriteLine(result + "\n");
        }
 
        static void Main(string[] args)
        {
            Calculate(Add1, 1);
            Calculate(Add2, 10);
            Console.ReadKey();
        }
    }
}

结果如下图
weituo1

组合委托

可以使用额外的运算符来"组合"。如:+=,+等
移除可使用-=等

实例

namespace Func
{
   public delegate int MyDel(int num);
    class Program
    {
        static int MyInstaObj(int num) {
            Console.WriteLine("MyInstaObj");
            return num;
        }

        static int SClass(int num)
        {
            Console.WriteLine("SClass");
            return num;
        }
        static void Main(string[] args)
        {
            MyDel dela = MyInstaObj;
            MyDel delb = SClass;
            MyDel delc = dela + delb;
            int d = delc(1);
            Console.WriteLine("d=========" + d + "=============");

            //或使用+=
            MyDel delD = MyInstaObj;  
            delD += SClass;
            int d2 = delD(2);
            Console.WriteLine("d2=========" + d2 + "============");

            //使用-=移除
            delD -= SClass;
            int d3 = delD(3);
            Console.WriteLine("d3=========" + d3 + "============");
            Console.ReadKey();
        }
    }
}

运算结果
weituo2.png

匿名方法

1.在初始化委托时内联声明方法
2.不会显式声明返回类型
3.参数类型,数量,修饰符必须和委托匹配
4.匿名方法可以访问它们外围作用域的局部变量和环境

实例

namespace Func
{
   public delegate int OtherDel(int inParam);
    class Program
    {
        static void Main(string[] args)
        {
            OtherDel del = delegate (int x)
            {
                return x + 20;
            };
        }
    }
}

Lambda表达式

1.删除delegate关键字
2.在参数列表和方法主体之间放=>运算符

实例

namespace Func
{
   public delegate int OtherDel(int inParam);
    class Program
    {
        static void Main(string[] args)
        {
            OtherDel del = (int x) => {return x + 20;};
            //或
            OtherDel del = x => x + 20;     //只有一个参数,可以省略圆括号
        }
    }
}
分享到:
Mecanim动画系统-IK
npm运行脚本报错,报:无法加载文件...因为在此系统上禁止运行脚本
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,730次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图