C# 泛型委托学习之前首先来看看什么是C# 委托,C# 委托是一种引用方法的类型。一旦为委托分配了方法,C# 委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,便可以分配自己的委托方法。
C# 泛型委托代码
- public delegate int PerformCalculation(int x, int y);
将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。例如,可以向排序算法传递对比较两个对象的方法的引用。分离比较代码使得可以采用更通用的方式编写算法。
C# 委托具有以下特点:
◆C# 委托类似于 C++ 函数指针,但它是类型安全的。
◆C# 委托允许将方法作为参数进行传递。
◆C# 委托可用于定义回调方法。
◆C# 委托可以链接在一起;例如,可以对一个事件调用多个方法。
◆方法不需要与委托签名精确匹配。
◆C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
C# 泛型委托的理解及应用:
C# 委托可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,就像实例化泛型类或调用泛型方法一样,如下例所示:
C# 泛型委托代码
- public delegate void Del﹤T﹥(T item);
- public static void Notify(int i) { }
- Del﹤int﹥ m1 = new Del﹤int﹥(Notify);
C# 2.0 版具有称为方法组转换的新功能,此功能适用于具体委托类型和泛型委托类型,并使您可以使用如下简化的语法写入上一行:
C# 泛型委托代码
- Del﹤int﹥ m2 = Notify;
在泛型类内部定义的委托使用泛型类类型参数的方式可以与类方法所使用的方式相同。
C# 泛型委托代码
- class Stack﹤T﹥
- {
- T[] items;
- int index;
- public delegate void StackDelegate(T[] items);
- }
引用委托的代码必须指定包含类的类型变量,如下所示:
C# 泛型委托代码
- private static void DoWork(float[] items) { }
- public static void TestStack()
- {
- Stack﹤float﹥ s = new Stack﹤float﹥();
- Stack﹤float﹥.StackDelegate d = DoWork;
- }
根据典型设计模式定义事件时,泛型委托尤其有用,因为发送方参数可以为强类型,不再需要强制转换成 Object,或反向强制转换。
C# 泛型委托代码
- delegate void StackEventHandler﹤T, U﹥(T sender, U eventArgs);
- class Stack﹤T﹥
- {
- public class StackEventArgs : System.EventArgs { }
- public event StackEventHandler﹤Stack﹤T﹥,
- StackEventArgs﹥ stackEvent;
- protected virtual void OnStackChanged(StackEventArgs a)
- {
- stackEvent(this, a);
- }
- }
- class SampleClass
- {
- public void HandleStackChange﹤T﹥(Stack﹤T﹥ stack,
- Stack﹤T﹥.StackEventArgs args) { }
- }
- public static void Test()
- {
- Stack﹤double﹥ s = new Stack﹤double﹥();
- SampleClass o = new SampleClass();
- s.stackEvent += o.HandleStackChange;
- }
C# 泛型委托的相关内容就向你介绍到这里,希望对你了解和学习C# 泛型委托有所帮助。
企业级的案例:
定义一个泛型委托:
public delegate T ServiceFactoryDelegate<T>(); //定义一个没有参数的泛型委托
/// <summary>
/// 帶適配器的公用類基類
/// </summary>
public class ServiceFactory<T>
{
private ServiceFactoryDelegate<T> serviceFactory; //定义一个泛型委托的变量serviceFactory
/// <summary>
/// serviceFactory委托变量是否有初始化,如果不为空则返回true
/// </summary>
public bool Initialized
{
get
{
return !serviceFactory.IsNull(); //一个陈述语句的命题,不为空就返回true
}
}
public T Service //此属性对委托进行调用
{
get
{
serviceFactory.CheckNull("Service Factory is not initialized.");
return serviceFactory(); //委托调用,此委托没有参数
}
}
//通过此方法,实例化ServiceFactoryDelegate<T>的对象serviceFactory
public void Initialize(ServiceFactoryDelegate<T> factory)
{
serviceFactory = factory;
}
}