带你了解c#泛型类的功能

  介绍

带你了解c#泛型类的功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在泛型类中,由于不知道泛型参数T是什么类型,可能是引用类型,也可能是值类型,因此不能将空等赋予泛型类型。如何对泛型对象赋初值,如何保证泛型的正确性等,以使用泛型文档管理器为例:

文档管理器用于从队列中读写文档。首先创建一个泛型管理器AddDocument()方法添加一个文档到队列中,IsDocumentAvailabe只读属性指示队列中是否还有文档。

公共类DocumentManager
  {
  私人只读的QueuedocumentQueue=new Queue ();
  
  公共空间AddDocument (T医生)
  {
  锁(这)
  {
  documentQueue.Enqueue (doc);
  }
  }
  
  公共bool IsDocumentAvailable
  {
  {documentQueue返回。数比;0;}
  }
  }

<强> 1,默认值

给DocumentManager类添加一个GetDocument()方法,该方法以返回队列中的一个文档。如果队列中存在文档,则返回一个文档,如果队列中已没有文档,则返回默认值。但是,对于泛型T,不能将null赋予T的对象,因为无法确定它是引用类型还是值类型。在c#中,为我们提供了一个默认的关键字,泛型T的对象赋予默认值,如:引用类型为null,值类int型等为0……

 IDocument公共接口
  {
  字符串标题{得到;设置;}
  字符串内容{得到;设置;}
  }
  
  公共类文档:IDocument
  {
  公共文档()
  {
  }
  
  公共文档(标题字符串,字符串的内容)
  {
  这一点。标题=标题;
  这一点。内容=内容;
  }
  
  公共字符串标题{得到;设置;}
  公共字符串内容{得到;设置;}
  }

给泛型文档管理器DocumentManager添加方法DisplayAllDocuments(),使得队列中所有文档的标题能展示出。在展示文档标题前,将类型T强制转换为IDocumnet接口,以显示标题:

公共类DocumentManager
  TDocument: IDocument
  {//?
  }

对于实现了约束的泛型文档管理器,可以处理任何实现了IDocument接口的类。其DisplayAllDocuments()方法改写为:

静态void Main ()
  {
  var dm=new DocumentManager ();
  dm.AddDocument(新文档(“标题A",“样本A"));
  dm.AddDocument(新文档(“标题B",“样本B"));
  
  dm.DisplayAllDocuments ();
  
  如果(dm.IsDocumentAvailable)
  {
  文档d=dm.GetDocument ();
  Console.WriteLine (d.Content);
  }
  }

泛型类型支持的几种约束:结构(结构约束,类型T必须是值类型),类(类约束,类型T必须是引用类型),IFoo(类型T必须实现接口IFoo),新()(构造函数约束,类型T必须有一个无参构造函数),另一个的(类型T派生自另一个的,也称“裸类型约束”)。

泛型约束中: