C# 委托

本文介绍了C#中的委托概念,它类似于函数指针,用于实现事件和回调。通过示例展示了如何定义、创建和使用委托,包括多播委托。同时提到了预定义的Action和Func委托类型,它们简化了无返回值和有返回值的委托操作。
摘要由CSDN通过智能技术生成

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

定义一个委托的基本方法是使用delegate关键字,如下

public delegate int MyDelegate (string s);

其中int为返回值类型,string s为参数列表,MyDelegate为委托的名称,有了这个声明,我们就可以用这个委托调用参数为string,返回值为int的方法了。下面是一个简单的示例。

using System;

namespace Delegate
{
    class Program
    {
        delegate int changeNum(int x);
        static int Num=10;
        static private int AddNum(int y)//注意委托调用的方法最好是静态的,否则需要先实例化对象
        {
            Num += y;
            return Num;
        }
        static private int MultNum(int y)
        {
            Num *= y;
            return Num;
        }
        static void Main(string[] args)
        {
            changeNum a = new changeNum(AddNum);
            //一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。
            //当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。
            a(5);
            Console.WriteLine("Num="+Num);
        }
    }
}
//输出为Num=15

委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面将上面代码的main函数部分略作改动

        static void Main(string[] args)
        {
            changeNum a = new changeNum(AddNum);
            changeNum b = new changeNum(MultNum);
            changeNum c;
            c = a;
            c += b;
            c(5);
            Console.WriteLine("Num="+Num);
        }
//输出为Num=75

除了delegate关键字,还有两种常用的委托为Action和Func。

Action就是一个预定义的没有返回值的委托,但它可以有参数。

using System;

namespace Delegate
{
    class Program
    {
        //不需要提前声明委托
        static int Num=10;
        static private void AddNum(int y)
        {
            Num += y;
            Console.WriteLine( Num);
        }
        static private void MultNum(int y)
        {
            Num *= y;
            Console.WriteLine(Num);
        }
        static void Main(string[] args)
        {
            Action<int> d1 = new Action<int>(AddNum);//有一个参数int,所以要写Action<int>
            Action<int> d2 = new Action<int>(MultNum);
            Action<int> d3;
            d3 = d1;
            d3 += d2;
            d3(5);
        }
    }
}
//输出为15  75

而Func则是一个预定义的有返回值(或许有参数)的委托

       //前面部分同上 
        static void Main(string[] args)
        {
            Func<int,int> a = new Func<int,int>(AddNum);//<int,int>分别为返回值和参数
            Func<int, int> b = new Func<int, int>(MultNum);
            Func<int, int> c;
            c = a;c += b;
            c(5);
            Console.WriteLine("Num="+Num);
        }
//输出为Num=75

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值