博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型类型参数及约束
阅读量:6402 次
发布时间:2019-06-23

本文共 3090 字,大约阅读时间需要 10 分钟。

  • 泛型类型参数简介

    在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“<>”内。

    泛型类型参数命名建议:

    (1)当泛型类型参数为单个字母时,建议用T表示。

    (1)当泛型类型参数用单词定义时,建议在单词前加T。

private void PromptName
(T t) {}private void PromptName
(Tuser user){}
  • 泛型类型参数约束

      在定义泛型类时,可以对在实例化泛型类时用于类型参数的类型种类施加限制。如果实例化泛型类时使用某个约束所不允许的类型来实例化类,则会产生编译时错误。

      泛型约束分类:  

约束

说明

T:结构

类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。

T:类

类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

 (1)类型参数约束为结构(struct)。

public class ShowObjectType
where T : struct { public void ShowValue
(T t) { Console.WriteLine(t.GetType()); } } class GenericConstraint { static void Main() { ShowObjectType
showInt = new ShowObjectType
(); showInt.ShowValue
(5); showInt.ShowValue(5);//从参数可以推导出类型参数类型,则可以省略类型参数类型 //因为约束为值类型,下面代码不能通过编译 ShowObjectType
showString = new ShowObjectType
(); showString.ShowValue("5"); Console.Read(); } }

   (2)类型参数约束为类(class)。

    在应用 where T : class 约束时,避免对类型参数使用 ==!= 运算符,因为这些运算符仅测试类型为引用类型,而不测试值相等性。

class GenericConstraint    {        static void Main()        {              List
list = new List
(); AddClass
(list, "hello generic"); Console.Read(); } private static void AddClass
(List
list, T t) where T : class { list.Add(t); } }

  (4)类型参数约束为具体类。

         约束为具体类时,可利用类型参数调用具体类的属性和方法。

class GenericConstraint    {        static void Main()        {            Person person = new Person { ID = 1, Name = "David" };            PromptName
(person); Console.Read(); } //此约束T为Person对象或者继承Person对象 private static void PromptName
(T t) where T : Person { //此处可使用Person的Name属性 if (t.Name == "David") { Console.WriteLine("Person name is David"); } string name = t.GetName(); Console.WriteLine("Person name is {0}", name); } } public class Person { private int id; public int ID { get { return id; } set { id = value; } } private string name; public string Name { get { return name; } set { name = value; } } public string GetName() { return Name; } }

    (5)约束多个参数。

class Base { }class Test
where U : struct where T : Base, new() { }

    (6)未绑定类型参数。

      没有约束的类型参数,称为未绑定的类型参数。

class  List
{}

 

转载于:https://www.cnblogs.com/wanghonghu/archive/2012/07/11/2586920.html

你可能感兴趣的文章
物联网WiFi芯片“爆发式”增长的原因
查看>>
现代数据中心需要保持最佳实践
查看>>
《CATIA V5 从入门到精通(第二版)》——2.6 通用的工具(Tools)
查看>>
《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.5.1 虚拟机可扩展性...
查看>>
《实施Cisco统一通信管理器(CIPT1)》一2.1 本章主题
查看>>
《电子基础与维修工具核心教程》——导读
查看>>
《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——第2章 本地开发环境搭建及程序开发基础 2.1 本地开发环境的搭建...
查看>>
互联网人出游必备清单
查看>>
Golang环境搭建
查看>>
《程序员的呐喊》一一1.5 作者手记:神秘机器的笔记
查看>>
《AutoCAD 2013中文版从入门到精通》——1.3 配置绘图系统
查看>>
《深入理解ElasticSearch》——2.8 ElasticSearch切面机制中的过滤器与作用域
查看>>
Mozilla 开源 web 虚拟现实框架 A-Frame
查看>>
Libreboot 申请重新加入 GNU
查看>>
《伟大的计算原理》一总结
查看>>
开源笔记本 Novena 将支持宽频软件无线电
查看>>
程序员怎样才能找到一个靠谱的创业公司
查看>>
《实施Cisco统一通信VoIP和QoS(CVOICE)学习指南(第4版)》一第1章 介绍语音网关...
查看>>
ZFS On Linux 现状,是否足够稳定了?
查看>>
《OpenCV图像处理》——2.5 算术运算
查看>>