掌握C#自定义泛型类:从初始化说起-阿里云开发者社区

开发者社区> 阿秀a> 正文

掌握C#自定义泛型类:从初始化说起

简介:   Generic是Framework 2.0的新元素,中文名字称之为“泛型” ,特征是一个带有尖括号的类,比如List< T> C#自定义泛型类用得最广泛,就是集合(Collection)中。
+关注继续查看

  •  

    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.     }  

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


  1. public class MyGeneric < TKey, TValue>  
  2. ...{  
  3.      private TKey key;  
  4.      private TValue value;  
  5.  
  6.      public void Method (TKey k, TValue v)  
  7.      ...{  
  8.      }  
  9. }  

泛型的初始化:泛型是需要进行初始化的。使用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.  
  8. // 让范型类T实现这个interface  
  9. public class MyGeneric < T>  
  10. where T : IDocument  
  11. ...{  
  12.      public void Method(T v)  
  13.      ...{  
  14.           Console.WriteLine(v.Title);  
  15.      }  
  16. }  
  17.  
  18. // 传入的类也必须实现interface  
  19. public class Document : IDocument  
  20. ...{  
  21. ......  
  22. }  
  23.  
  24. // 使用这个泛型  
  25. 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.  
  3. private void Swap (ref T x, ref T y)  
  4. ...{  
  5.     T temp = x;  
  6.     x = y;  
  7.     y = temp;  
  8. }  
  9.  
  10. // 调用  
  11. public void Run()  
  12. ...{  
  13.    int i,j;  
  14.    i = 3;  
  15.    j = 5;  
  16.    delegateSample< int> sample = new delegateSample< int> (Swap);  
  17.    sample(i, j);  

设置可空值类型:一般来说,值类型的变量是非空的。但是,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.  
  5. for (int i = segment.Offset; i< = segment.Offset + segment.Count; i++)  
  6. ...{  
  7.    Console.WriteLine(segment.Array[i]);    // 使用Array属性来访问传递的数组  

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
42_自定义泛型类的应用
写一个泛型Dao来说明 package com.itcast.day2; /** * 泛型类型案例 * @author hp * * @param */ public class GenericDao { /** * 增加 * @p...
609 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4479 0
java泛型学习4之自定义泛型类(DAO)
  例一 package cn.xy.test; public class GenericDao {  public &lt;T&gt; void add(T t)  {  }  public &lt;T&gt; T getModelById(int id)  {   return null;  } } 这个类中泛型方法被常规使用,但两个方法之间的T没有联系和相互
882 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7751 0
C# 自定义控件固定大小
原文地址:http://blog.csdn.net/pksniq/article/details/7247131 今天做自定义,需要固定控件大小,一共找到了三种方法:  1.设置最大与最小值相等 2.在resize事件中指定大小 3.通过自定义设计器来禁止修改大小
1001 0
C++ 模版实现自定义释放类对象成员的堆内存空间
#include &lt;iostream&gt; using namespace std; template&lt;typename Type&gt; class AutoRelease { typedef void (Type::* pFunc)(void); public: AutoRelease(Type* p, pFunc pfunc) :
1031 0
C# 自定义属性在propertyGrid控件中显示
在上篇文章(地址: C# 设计时动态改变实体在PropertyGrid中显示出来的属性)中可以看到: 自定义属性的显示是有问题的,那么如何修改呢? 代码如下: public class PropertyDisplayConverterr&lt;T&gt; : ExpandableObjectConverter where T : IDisplay { public
2601 0
+关注
阿秀a
专注于大型分布式系统的架构和实践,精通阿里云相关产品使用,专注阿里云VPC,专有云,分布式服务互通等技术的研究
89
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载