C# 2.0 泛型

简介:
[源码下载]


C# 2.0 泛型


作者: webabcd


介绍
泛型是 C# 2.0 的最强大的功能。通过泛型可以定义类型安全的数据结构,而无须使用实际的数据类型。这能够显著提高性能并得到更高质量的代码,因为您可以重用数据处理算法。


泛型类
/*--- 
 * 如何 使用 和 继承 泛型类 
---*/
 
using System; 
using System.Collections.Generic; 
 
// 泛型类 
public  class GenericClass<T> 

         // 返回泛型的具体类型和ToString()后的值 
         public  virtual  string Output(T t) 
        { 
                 return  "类型:" + t.GetType().ToString() +  ";值:" + t.ToString(); 
        } 

 
// 继承自一个泛型类,指定基类的泛型的具体类型 
public  class InheritClass1 : GenericClass< string

 

 
// 继承自一个泛型类,基类和子类都是同一泛型 
public  class InheritClass2<T> : GenericClass<T> 

         public  override  string Output(T t) 
        { 
                 return  "子类实现-类型:" + t.GetType().ToString() +  ";值:" + t.ToString(); 
        } 

 
// 继承自一个泛型类,指定基类的泛型的具体类型,子类仍然可以是泛型 
public  class InheritClass3<Z> : GenericClass< double

         public  string ChildOutput(Z z) 
        { 
                 return  "子类实现-类型:" + z.GetType().ToString() +  ";值:" + z.ToString(); 
        } 

 
 
public partial  class Generic_Class : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                GenericClass<DateTime> c =  new GenericClass<DateTime>(); 
                Response.Write(c.Output(DateTime.Now) +  "<br />"); 
 
                InheritClass1 c1 =  new InheritClass1(); 
                Response.Write(c1.Output( "abc") +  "<br />"); 
 
                GenericClass<Guid> c2 =  new InheritClass2<Guid>(); 
                Response.Write(c2.Output( new Guid()) +  "<br />"); 
 
                InheritClass3< int> c3 =  new InheritClass3< int>(); 
                Response.Write(c3.Output(Math.PI) +  " ||| " + c3.ChildOutput(123) +  "<br />"); 
        } 
}
 
运行结果
类型:System.DateTime;值:2007-2-10 22:56:09
类型:System.String;值:abc
子类实现-类型:System.Guid;值:00000000-0000-0000-0000-000000000000
类型:System.Double;值:3.14159265358979 ||| 子类实现-类型:System.Int32;值:123


泛型方法
/*--- 
 * 如何 使用 泛型方法    
---*/
 
using System; 
using System.Collections.Generic; 
 
public  class GenericMethod 

         // 静态 泛型方法 
         public  static  string Output<T>(T t) 
        { 
                 return  "类型:" + t.GetType().ToString() +  ";值:" + t.ToString(); 
        } 

 
 
public partial  class Generic_Method : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                Response.Write(GenericMethod.Output< int>(23) +  "<br />"); 
                Response.Write(GenericMethod.Output<DateTime>(DateTime.Now) +  "<br />"); 
        } 
}
 
运行结果
类型:System.Int32;值:23
类型:System.DateTime;值:2007-2-10 22:57:29


泛型委托
/*--- 
 * 如何 使用 泛型委托 
---*/
 
using System; 
using System.Collections.Generic; 
 
public  class GenericDelegate 

         // 声明一个泛型委托 
         public  delegate  string OutputDelegate<T>(T t); 
 
         // 定义一个静态方法 
         public  static  string DelegateFun( string s) 
        { 
                 return String.Format( "Hello, {0}", s); 
        } 
 
         // 定义一个静态方法 
         public  static  string DelegateFun(DateTime dt) 
        { 
                 return String.Format( "Time, {0}", dt.ToString()); 
        } 

 
 
public partial  class Generic_Delegate : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                 // 使用泛型委托 
                GenericDelegate.OutputDelegate< string> delegate1 
                        =  new GenericDelegate.OutputDelegate< string>(GenericDelegate.DelegateFun); 
 
                Response.Write(delegate1( "aabbcc")); 
                Response.Write( "<br />"); 
 
                 // 使用泛型委托(匿名方法) 
                GenericDelegate.OutputDelegate<DateTime> delegate2 = GenericDelegate.DelegateFun; 
                Response.Write(delegate2(DateTime.Now)); 
        } 
}
 
运行结果
Hello, aabbcc
Time, 2007-2-10 22:59:26


抽象泛型类,派生约束
/*--- 
 * 如何 使用 和 继承 抽象泛型类    
 * 派生约束 
---*/
 
using System; 
using System.Collections.Generic; 
 
// 泛型抽象类 
public  abstract  class GenericParent 

         // 泛型抽象方法,返回值为一个泛型,加一个约束使泛型X要继承自泛型Y 
         public  abstract X Output<X, Y>(X x, Y y) where X : Y; 
 
         // 泛型抽象方法,返回值为一个string类型,加一个约束使泛型X要继承自泛型Y 
         public  abstract  string Output2<X>(X x) where X : System.ComponentModel.IListSource; 

 
public  class GenericChild : GenericParent 

         // 重写抽象类的泛型方法 
         public  override T Output<T, Z>(T t, Z z) 
        { 
                 return t; 
        } 
 
         // 重写抽象类的泛型方法 
         public  override  string Output2<T>(T t) 
        { 
                 return t.GetType().ToString(); 
        } 

 
 
public partial  class Generic_Abstract : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                GenericChild gc =  new GenericChild(); 
                Response.Write(gc.Output< string, IComparable>( "aaa""xxx")); 
                Response.Write( "<br />"); 
 
                Response.Write(gc.Output2<System.Data.DataTable>( new System.Data.DataTable())); 
                Response.Write( "<br />"); 
        } 
}
 
运行结果
aaa
System.Data.DataTable


泛型接口,派生约束,构造函数约束
/*--- 
 * 如何 使用 泛型接口 
 * 派生约束 
 * 构造函数约束(如果实例化的话) 
---*/
 
using System; 
using System.Collections.Generic; 
 
// 泛型接口 
public  interface IGenericInterface<T> 

        T CreateInstance(); 

 
// 实现上面泛型接口的泛型类 
// 派生约束where T : TI(T要继承自TI) 
// 构造函数约束where T : new()(T可以实例化) 
public  class Factory<T, TI> : IGenericInterface<TI> 
        where T : TI,  new() 

         public TI CreateInstance() 
        { 
                 return  new T(); 
        } 

 
 
public partial  class Generic_Interface : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                IGenericInterface<System.ComponentModel.IListSource> factory = 
                         new Factory<System.Data.DataTable, System.ComponentModel.IListSource>(); 
 
                Response.Write(factory.CreateInstance().GetType().ToString()); 
                Response.Write( "<br />"); 
        } 
}
 
运行结果
System.Data.DataTable


其它
/*--- 
 * 泛型 其它 
---*/
 
using System; 
using System.Collections.Generic; 
 
// 泛型也可以使用别名 
using MyList = System.Collections.Generic.List< string>; 
 
public partial  class Generic_Other : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                MyList ml =  new MyList(); 
                ml.Add( "aaa"); 
                ml.Add( "bbb"); 
 
                Response.Write(ml[0]); 
                Response.Write( "<br />"); 
                Response.Write(ml[1]); 
 
                 // 其它说明 
                 // 值类型约束 public class MyClass<T> where T : struct { } 
                 // 引用类型约束 public class MyClass<T> where T : class { } 
                 // 没有泛型属性 
        } 
}
 
 
运行结果
aaa
bbb


OK
[源码下载]



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345403,如需转载请自行联系原作者





相关文章
|
7月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
存储 算法 安全
C#三十二 泛型的理解和使用
C#三十二 泛型的理解和使用
37 0
|
3月前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
82 11
|
4月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
68 4
|
4月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
38 0
|
7月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
63 1
|
7月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
359 2
|
7月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
7月前
|
存储 Java 编译器
【从Java转C#】第五章:泛型
【从Java转C#】第五章:泛型
|
机器学习/深度学习 存储 缓存
一文带你搞懂C#泛型
泛型是.net 2.0中提供的新特性,是框架的一种升级,用于处理用一个事物来代替多种不同需求的情况。下面我们就一块来看一下具体的讲解吧。