泛型类( 转载)

C#自定义泛型类用得最广泛的就是在集合(Collection)中。本文介绍了C#自定义泛型Generic的用法。

AD:51CTO学院:IT精品课程在线看!

Generic是Framework 2.0的新元素,中文名字称之为“泛型” ,特征是一个带有尖括号的类,比如List< T>

C#自定义泛型类用得最广泛,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。

这里只讨论C#自定义泛型类。基本自定义如下:

  1. public class MyGeneric < T>

  2. ...{

  3. private T member;

  4. public void Method (T obj)

  5. ...{

  6. }

  7. }

这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。

  1. public class MyGeneric < TKey, TValue>

  2. ...{

  3. private TKey key;

  4. private TValue value;
  5. public void Method (TKey k, TValue v)

  6. ...{

  7. }

  8. }

泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。

限制:如果我们知道,这个将要传入的泛型类T,必定具有某些的属性,那么我们就可以在MyGeneric<
T>中使用T的这些属性。这一点,是通过interface来实现的。

  1. // 先定义一个interface

  2. public interface IDocument

  3. ...{

  4. string Title ...{get;}

  5. string Content ...{get;}

  6. }
  7. // 让范型类T实现这个interface

  8. public class MyGeneric < T>

  9. where T : IDocument

  10. ...{

  11. public void Method(T v)

  12. ...{

  13. Console.WriteLine(v.Title);

  14. }

  15. }
  16. // 传入的类也必须实现interface

  17. public class Document : IDocument

  18. ...{

  19. ......

  20. }
  21. // 使用这个泛型

  22. MyGeneric< Document> doc = new MyGeneric< Document>();

泛型方法:我们同样可以定义泛型的方法

  1. void Swap< T> (ref T x, ref T y)

  2. ...{

  3. T temp = x;

  4. x = y;

  5. y = temp;

  6. }

泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理

  1. public delegate void delegateSample < T> (ref T x, ref T y)
  2. private void Swap (ref T x, ref T y)

  3. ...{

  4. T temp = x;

  5. x = y;

  6. y = temp;

  7. }
  8. // 调用

  9. public void Run()

  10. ...{

  11. int i,j;

  12. i = 3;

  13. j = 5;

  14. delegateSample< int> sample = new delegateSample< int> (Swap);

  15. sample(i, j);

  16. }

设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable< T>可以解决这个问题。

  1. Nullable< int> x;   // 这样就设置了一个可空的整数变量x

  2. x = 4;

  3. x += 3;

  4. if (x.HasValue)   // 使用HasValue属性来检查x是否为空

  5. ...{ Console.WriteLine ("x="+x.ToString());

  6. }

  7. x = null;    // 可设空值

使用ArraySegment<
T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。

  1. int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};

  2. // 第一个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数

  3. ArraySegment< int> segment = new ArraySegment< int>(arr, 2, 3);  // (array, offset, count)
  4. for (int i = segment.Offset; i< = segment.Offset + segment.Count; i++)

  5. ...{

  6. Console.WriteLine(segment.Array[i]);    // 使用Array属性来访问传递的数组

  7. }

在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。

以上就是C#自定义泛型类的用法介绍

时间: 2024-10-26 02:06:17

泛型类( 转载)的相关文章

Java泛型类泛型方法

使用泛型,在某些情况下可以有效减少代码量. Pair泛型类可以根据传入的参数类型进行相应的构造. minmax是泛型方法,不同数据类型的数组,也可以得到他们的min max值,需要注意的是传进去的T[]类类型必须是实现了Comparable方法的,否则无法调用compareTo()方法. 另外,泛型的类型必须是类类型,int, double, float这种是不行的,必须是Integer, Double, Float, String, StudentClass这种类类型的. /** 泛型类 *

泛型类、泛型方法及泛型应用

泛型类.泛型方法及泛型应用 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制

c# 和 java &lt;转载&gt;http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html

从语法层面来讲,c# 和 java 是非常相似的. <转载> 这篇文章对C#与Java做一个语言级的对比,方便C#转Java或Java转C#的人有个大致了解.这里大致用C#3.0与Java6.0做比较. 写完后得知维基百科里有更加全面得多的比较: http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java .NET(C#)   Java   基本类型   基本类型 C#中有无符号数,Java没有. C#中有值类型,且可自己定义值类型的

List&lt;T&gt;和IList&lt;T&gt;的区别(转载)

List<T>和IList<T>的区别 对List<T>和IList<T>不是很清楚,这看到一篇不错的文章,贴过来了 List<T>类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索.排序和操作的方法. IList<T>接口:表示可按照索引单独访问的一组对象. 下面谈谈它们之间的区别: 首先,List<T>是一个类,IList<T>是一个接口.接口和类的区别是本质的,类是负责功能的实现,而接口则是

说说C#中list与IList中的区别(转载)

首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口. 但是它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IList<T>可以胜任. 不过,更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序.这个时候IList<T>就爱莫能助了. 1.当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间. 2.IList <&

转载:《TypeScript 中文入门教程》 9、泛型

版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据. 这样用户就可以以自己的数据类型来使用组件. 泛型之Hello World 下面来创建第一个使用泛型的例

从友盟微社区看Android第三方SDK架构实践【转载】

从友盟微社区看Android第三方SDK架构实践[转载] “先写在前面吧,本来想通过链接来转载这篇文章,发现没找到有相关的按钮.上网查了一下,都说博客园没有这功能.我在博客园也有一段时间了,鼓励原创是必须的,不过适当的转载也算是一种将有价值的文章进行分享的方式,不知道以后会不会支持呢!” 原文链接:http://www.csdn.net/article/2015-05-08/2824648-micro-community 摘要:第三方SDK的开发需要考虑很多因素,比如稳定性.灵活性等,并且还要做

【转载】Java泛型详解

[转载]http://www.importnew.com/24029.html 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<