声明:今天我们来谈谈委托,基础语法和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);
}
}
}