zoukankan      html  css  js  c++  java
  • 泛型的where

    泛型的Where能够对类型参数作出限定。有以下几种方式。

     

    l         where T : struct   限制类型参数T必须继承自System.ValueType。

     

    l         where T : class    限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。

     

    l         where T : new()   限制类型参数T必须有一个缺省的构造函数

     

    l         where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。

     

    以上这些限定可以组合使用,比如:

     

    public class Point<T> where T : class, IComparable, new()

     

     

     

    泛型的机制

     

    l  机制: C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以on-demand的方式,发生在JIT编译时。

     

    l  编译机制:

     

    1.第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符

     

    2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。

     

     

     

    泛型的一些问题

     

    l 不支持操作符重载。我只知道这么多了

     

     

     

    范型的意义

     

    泛型的意义何在?类型安全和减少装箱、拆箱并不是泛型的意义,而是泛型带来的两个好处而已(或许在.net泛型中,这是最明显的好处了)。泛型的意义在于 ——把类型作为参数,它实现了代码之间的很好的横向联系,我们知道继承为代码提供了一种从上往下的纵向联系,但泛型提供了方便的横向联系(从某种程度上说,它和AOP在思想上有相通之处)。在PersonCollection例子中,我们知道Add()方法和Remove()方法的参数类型相同,但我们明确无法告诉我们的程序这一点,泛型提供了一种机制,让程序知道这些。道理虽然简单,但这样的机制或许能给我们的程序带来一些深远的变化吧。

  • 相关阅读:
    java.logging的重定向?
    java.rmi.NoSuchObjectException: no such object in table
    jmx : ClientCommunicatorAdmin Checker-run
    jmx完整示例
    Android studio 下的SDK Manager只显示已安装包的情况
    Android Studio: Error:Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry
    浅谈Kotlin(二):基本类型、基本语法、代码风格
    浅谈Kotlin(一):简介及Android Studio中配置
    源码浅谈(一):java中的 toString()方法
    ButterKnife注解框架详解
  • 原文地址:https://www.cnblogs.com/xiaocai0923/p/2227505.html
Copyright © 2011-2022 走看看