C# 委托(Delegate)

声明:今天我们来谈谈委托,基础语法和Demo,非实战操作。仅供参考使用。

大纲

1、C# 中通过委托调用静态方法
2、C# 中通过委托调用实例化方法
3、C# 的 Multicasting of a Delegate(委托的多播)

1、C# 中通过委托调用静态方法

C# 中的委托(Delegate)
类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

delegate声明格式:

delegate <return type> <delegate-name> <parameter list>

案例
创建一个控制台程序,Program 核心代码如下:

     class Program
    {
        //System.Delegate 
        public delegate int MemberChanger(int m);
        static int num = 10;
        static void Main(string[] args)
        {
            // Instantiation the delegate
            MemberChanger delM = new MemberChanger(Add);
            //Invoke the method
            delM(2);

            //Print the result
            Console.WriteLine("Value of num {0}",num);

            Console.ReadKey();
        }

        /// <summary>
        /// The method to Add "p" and "num"
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public static int Add(int p)
        {
            num += p;
            return num;
        }
    }

2、C# 中通过委托调用实例化方法

同一个委托,可以执行多个不同的方法。
案例

using System;

namespace Delegate
{
    public delegate int MemberChanger(int m);
    class Program
    {
        static void Main(string[] args)
        {

            MyClass myClass = new MyClass();
            MemberChanger delM2 = new MemberChanger(myClass.Add);
            delM2(6);
            Console.WriteLine("Value of instance nums:{0}",myClass.nums);

            MemberChanger delM3 = new MemberChanger(myClass.Multi);
            delM3(6);
            Console.WriteLine("Value of instance nums:{0}", myClass.nums);            

            Console.ReadKey();
        }
    }

    class MyClass
    {
        public int nums = 5;
        public int Add(int p)
        {
            nums += p;
            return nums;
        }

        public int Multi(int p)
        {
            nums *= p;
            return nums;
        }
    }
}

3、C# 的 Multicasting of a Delegate(委托的多播)

委托对象可使用 “+” 运算符进行合并。
一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。”-” 运算符可用于从合并的委托中移除组件委托。
使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Multicasting_of_a_delegate
{
    delegate void D(int x);
    class Program
    {
        static void Main(string[] args)
        {
            D d1 = new D(A.A1);
            d1(1);
            Console.WriteLine();

            D d2 = new D(A.A2);
            d2(2);
            Console.WriteLine();

            D d3 = d1 + d2;
            d3(10);
            Console.WriteLine();

            A a = new A();
            D d4 = new D(a.A3);
            d3 += d4;
            d3(40);
            Console.WriteLine();

            d3 += A.A1;
            d3(3);
            Console.WriteLine();

            d3 -= A.A1;
            d3(4);
            Console.WriteLine();

            d3 -= d1;
            d3 -= d2;
            d3 -= d4;
            d3(4);//throw a exception:Null...
            d3 -= d4;//also -= any delegate or method
            d3(5);//no error
            Console.WriteLine();

            Console.ReadKey();
        }
    }

    class A
    {
        public static void A1(int i)
        {
            Console.WriteLine("A.A1:"+i);
        }

        public static void A2(int i)
        {
            Console.WriteLine("A.A2:" + i);
        }

        public  void A3(int i)
        {
            Console.WriteLine("A.A3:" + i);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值