C# - 泛型委托的应用示例

泛型委托的基本语法格式如下:

delegate ReturnType DelegateName<Type>(Type x, Type y);

通过实践发现,泛型委托可以大大减少代码量,下面举个例子

如:分别使用四则运算来计算一系列算式,然后汇总计算结果。

一开始我也是很笨的定义了四个四则运算的方法。

class Calculator

{

delegate int calc(int x, int y);

public int Add(int x, int y)

{

return x + y;

}

public int Minus(int x, int y)

{

return x - y;

}

public int Multiply(int x, int y)

{

return x + y;

}

public int Divide(int x, int y)

{

if (y != 0)

return x / y;

else throw new Exception("Cannot divide by zero.!");

}

}

然后在使用的时定义委托实例,传递方法。

static void Main(string[] args)

{

Calculator calc = new Calculator();

Calculator.DCalc dc = calc.Add;

int addResult = dc.Invoke(3, 4);

dc = calc.Minus;

int minusResult = dc.Invoke(3, 4);

dc = calc.Multiply;

int multiplyResult = dc.Invoke(3, 4);

dc = calc.Divide;

int dividedResult = dc.Invoke(3, 4);

int result = addResult + minusResult + multiplyResult + dividedResult;

Console.WriteLine(result);

Console.Read();

}

看看换成泛型委托会变成什么样

这时我们的计算类更为简洁

class Calculator

{

public delegate T CalcDelegate<T>(T x, T y);

}

而对于调用,则需要定义各类运算的代码,这里使用了匿名函数:

static void Main(string[] args)

{

Calculator.CalcDelegate<int> dc = new Calculator.CalcDelegate<int>((a, b) =>

{

return a + b;

});

int addResult = dc.Invoke(3, 4);

dc = new Calculator.CalcDelegate<int>((a, b) =>

{

return a - b;

});

int minusResult = dc.Invoke(3, 4);

dc = new Calculator.CalcDelegate<int>((a, b) =>

{

return a * b;

});

int multiplyResult = dc.Invoke(3, 4);

dc = new Calculator.CalcDelegate<int>((a, b) =>

{

if (b != 0) return a / b;

else throw new Exception("Cannot divide by zero.!");

});

int dividedResult = dc.Invoke(3, 2);

int result = addResult + minusResult + multiplyResult + dividedResult;

Console.WriteLine(result);

Console.Read();

}

由此可见,泛型委托帮助我们减少了对象成员的定义工作。

时间: 2024-08-11 09:57:11

C# - 泛型委托的应用示例的相关文章

List&lt;string&gt;中的泛型委托

我们先看List<T>.Sort().其定义是:public void Sort( Comparison<T> comparison ) 其要求传入的参数是Comparison<T> comparison.那我们看看Comparison<T> comparison 要求我们传入哪些参数.返回什么样的值. 查阅MSDN后,我们发现Comparison<T> 要求我们传入两个T的示例,即t1和t2:返回结果是整数,如果t1<t2返回-1,如果相

泛型委托使用

泛型委托基础 class Program class Program { // 泛型委托,与普通委托类似,不同之处只在于使用泛型委托要指定泛型参数 public delegate T MyGenericDelegate<T>(T obj1,T obj2); int AddInt(int x, int y) { return x + y; } string AddString(string s1, string s2) { return s1 + s2; } static void Main(s

泛型接口、泛型委托、泛型方法、泛型约束

泛型接口 没有泛型接口,每次试图使用一个非泛型接口(如IComparable)来操纵一个值类型时,都会进行装箱,而且会丢失编译时的类型安全性.这会严重限制泛型类型的应用.所以,CLR提供了对泛型接口的支持.一个引用类型或值类型为了实现一个泛型接口,可以具体指定类型实参:另外,一个类型也可以保持类型实参的未指定状态来实现一个泛型接口.来看一些例子: 以下泛型接口定义是作为FCL的一部分发布的: public interface IEnumerable<T> : IDisposable, IEnu

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型.利用"参数化类型"将类型抽象化,从而实现灵活的复用.在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率.更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的.因此,我们很有必要掌握并善用这个强大的语言特性. C#泛型特点: 1.如果实例化泛型类型的参数相同,那么JIT编辑器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能

Java实现泛型委托类似C#Action&lt;T&gt;

一.C# Action<T> 泛型委托(帮助理解委托) 描述: 封装一个方法,该方法只采用一个参数并且不返回值. 语法: public delegate void Action<T>(T arg); T: 参数类型:此委托封装的方法的参数类型 arg: 参数:此委托封装的方法的参数 备注: 通过此委托,可以将方法当做参数进行传递.Action<T> 泛型委托:封装一个方法,该方法只采用一个参数并且不返回值.可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托.该

委托应用及泛型委托和多播委托

一.委托一般作为方法的参数或者返回值,或者使用多播委托(注册多个方法,可以全部触发) 1.示例:根据对于字符串不同的处理方法逻辑 private delegate void PrintString(string str); static void PrintStr( PrintString print,string str ) { print(str); } static void Method1(string str) { Console.WriteLine(str); } static vo

【C#复习总结】细说泛型委托

1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名方法 系列3:细说Lambda表达式 系列4:细说泛型委托 系列5:细说表达式树 系列6:细说事件 还是用大佬的文章来震场吧,“随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了.” 这次我们提前贴代码来体验一下泛型委托与一般委托和匿名

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti