泛型的使用[C#]
2009-06-26 10:22
120 查看
这里有有关泛型的超详细的介绍
http://msdn.microsoft.com/zh-cn/library/512aeb7t(VS.80).aspx
接下来我用简单的应用来介绍一下泛型的使用
在很多场合,我们写的代码可能会除了类型不一样外,代码完全一样。这样的话我们就可能重复写很多代码。
当然,你也可以不写那么多代码而进行类型转换。
如: 数据类型<-->Object<-->另一数据类型
但这样做的代价是非常惨重的,因为这其中会涉及到数据的装箱和拆箱,关于装箱与拆箱,下面引用Effective C#的一段话,如下:
装箱是把一个值类型数据放置在一个无类型的引用对象上,从而使一个值类型在须要时可以当成引用类型来使用。拆箱则是额外的从“箱”上拷贝一份值类型数据。装箱和拆箱可以让你在须要使用System.Object对象的地方使用值类型数据。但装箱与拆箱操作却是性能的强盗,在些时候装箱与拆箱会产生一些临时对象,它会导致程序存在一些隐藏的BUG。应该尽可能的避免使用装箱与拆箱。
所以,这个问题在C++中,是用模板来解决,而在.NET中,就是用泛型来解决了,泛型使得我们可以最大限度地代码重用。
下面我给一下例子,注释中写得挺细了,我就不一一解释了。代码如下:
http://msdn.microsoft.com/zh-cn/library/512aeb7t(VS.80).aspx
接下来我用简单的应用来介绍一下泛型的使用
在很多场合,我们写的代码可能会除了类型不一样外,代码完全一样。这样的话我们就可能重复写很多代码。
当然,你也可以不写那么多代码而进行类型转换。
如: 数据类型<-->Object<-->另一数据类型
但这样做的代价是非常惨重的,因为这其中会涉及到数据的装箱和拆箱,关于装箱与拆箱,下面引用Effective C#的一段话,如下:
装箱是把一个值类型数据放置在一个无类型的引用对象上,从而使一个值类型在须要时可以当成引用类型来使用。拆箱则是额外的从“箱”上拷贝一份值类型数据。装箱和拆箱可以让你在须要使用System.Object对象的地方使用值类型数据。但装箱与拆箱操作却是性能的强盗,在些时候装箱与拆箱会产生一些临时对象,它会导致程序存在一些隐藏的BUG。应该尽可能的避免使用装箱与拆箱。
所以,这个问题在C++中,是用模板来解决,而在.NET中,就是用泛型来解决了,泛型使得我们可以最大限度地代码重用。
下面我给一下例子,注释中写得挺细了,我就不一一解释了。代码如下:
using System; using System.Text; using System.Collections.Generic; namespace Gerneric { class Program { static void Main(string[] args) { //定义一个int型传入 Gerneric<int> objInt = new Gerneric<int>(new int[]{1,2,3,4,5}); objInt.fun(); //定义一个int型传入 Gerneric<string> objStr = new Gerneric<string>(new string[] { "Hello", "World", "I", "Like", "C#", "!" }); objStr.fun(); //定义一个char型传入 Gerneric<char> objChar = new Gerneric<char>(new char[] { 'h','e','l','l','o',',','u'}); objChar.fun(); Console.ReadKey(); } } //定义一个泛型 class Gerneric<T> { //泛型中除了可以定义<T>类型的数据成员和成员函数外,和类一样,其他的类型也是可以定义的. //---------------------------------------------------------------------- //可以在泛型类中定义基本的数据类型 int nMyselfType = 12; //也可以在泛型类里面定义一个.NET已有的泛型数据结构 List<string> lstStr=new List<string>(); //也可以定义一个类对象为泛型成员 CTest objTest = new CTest(); //---------------------------------------------------------------------- //接下来定义与类型<T>相关的数据成员或成员函数 T[] tBasicMember; //在构造函数里给tBasicMember赋值 public Gerneric(T[] tIn) { tBasicMember = new T[tIn.Length]; for (int i = 0; i < tIn.Length; i++) { tBasicMember[i] = tIn[i]; } } //定义一个方法来输入值 public void fun() { for (int i = 0; i < tBasicMember.Length; i++) { Console.Write(tBasicMember[i]+" "); } //输入一个基本类型的数据成员的值 Console.WriteLine("_____{0}",nMyselfType); //return tBasicMember.ToString(); } } //定义一个类,作为泛型的数据成员 class CTest { int a; void fun() { } } }
相关文章推荐
- C#过滤重复数据,使用泛型
- C#语言中泛型的使用和性能
- Unity3D使用C#中的泛型和接口
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
- 问题:C# Dictionary嵌套使用;结果:嵌套Dictionary添加 , C#2.0泛型详细介绍
- 三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)
- NET C# List泛型集合 使用方法
- 【C#】——泛型的使用
- ASP.NET 2.0 中泛型的使用(C# 编程指南)
- Unity C# 使用反射,利用字符串作为泛型参数调用泛型方法。
- C# 使用List泛型读取和保存文本文件
- C# 使用List泛型读取和保存文本文件
- C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句
- C#泛型集合—Dictionary<K,V>使用技巧
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- [C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,
- 【从CSLA中学C#】4 泛型的使用
- [泛型委托]-C# 三种泛型委托的使用
- C# 泛型对象的使用
- C#:泛型集合—List<T>使用技巧