zoukankan      html  css  js  c++  java
  • C# <T>泛型的使用

    在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。
    下面列出了六种类型的约束:

    约束说明

    T:结构  
    类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)。

    T:类  
    类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

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

    T:<基类名>  
    类型参数必须是指定的基类或派生自指定的基类。

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

    T:U  
    为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

    使用约束的原因:
    如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。例如,基类约束告诉编译器:仅此类型的对象或从此类型派生的对象才可用作类型参数。一旦编译器有了这个保证,它就能够允许在泛型类中调用该类型的方法。约束是使用上下文关键字 where 应用的。

    泛型约束基本上有五种:
    值类型约束:要求泛型参数必须是值类型,例如int,short以及自定义的stuct等
        public class MyClass2<T>
            where T : struct//这个泛型类只接受值类型的泛型参数
        {
        }
    引用类型约束:要求泛型参数必须是引用类型,例如string,object,以及自定义的class
        public class MyClass<T>
            where T:class//这个泛型类只接受引用类型的泛型参数
        {
        }
    构造函数约束:要求泛型参数必须有构造函数
        public class MyClass3<T>
            where T : new()
        {
        }
    接口约束:要求泛型参数必须实现某个接口
        public class MyClass4<T>
            where T : System.IComparable
        {
        }
    基类约束:要求泛型参数必须继承某个基类
        public class MyClass5<T>
            where T : Customer
        {
        }

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/zhang1f/p/11667012.html
Copyright © 2011-2022 走看看