zoukankan      html  css  js  c++  java
  • .NET 深入研究 接口与值类型

    http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html

    本文将不会阐述基本概念,请参考其它相关资料。

    1、 Interface的功能如此强大,如此的富有意义,值类型当然不会拒绝它。一个值类型可以实现一个或者多个接口。值类型有2种表现形式:未装箱(unboxed)和已装箱(boxed)

     

    2、虽然未装箱的值类型没有类型对象指针,但仍然可以调用由类型继承或者重写的虚方法(如:Equals,GetHashCode,ToString).如果你的值类型重写了其中任意一个虚方法,那么CLR可以非虚地调用该方法。因为值类型是密封的,没有任何类型能够从它们派生。此外,用于调用虚方法的值类型示例也不会被装箱。然而,如果你重写的虚方法要调用的方法在基类中实现,那么在调用基类的实现时,值类型实例就会装箱,以便通过this指针将一个堆对象的引用传给基方法。

     

    3、调用一个非虚,继承的方法时候(),无论如何都要对值类型进行装箱操作。这是因为这些方法是有System.Object定义的,所以这些方法期望this指针实参是指向堆上的一个对象的指针。

     

    4、将值类型的一个未装箱的实例转型为类型的某个接口,要求对实例进行装箱。这是因为接口变量必须包含对堆上的一个对象的引用。接口变量指向堆上的一个对象的引用,以使在CLR能检查对象的类型对象指针判断对象的确切类型。

     

    5、值类型是不可变的、使用接口更改已装箱值类型中的字段

        第一次看到这样的语句,我不知道到底这是什么意思。

     

    PS:

    学习东西最可怕的不是你记住的知识少,而是你记住的都是错误的!切身体会......

    通常为了调用一个虚方法,CLR 需要判断对象的类型,以定位类型的方法表。

    学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
  • 相关阅读:
    【PTA】6-11 先序输出叶结点 (15分)
    【PTA】6-10 二分查找 (20分)
    【PTA】6-9 二叉树的遍历 (25分)
    【PTA】6-8 求二叉树高度 (20分)
    【PTA】6-7 在一个数组中实现两个堆栈 (20分)
    【PTA】6-6 带头结点的链式表操作集 (20分)
    【PTA】6-5 链式表操作集 (20分)
    【PTA】6-4 链式表的按序号查找 (10分)
    【PTA】6-3 求链式表的表长 (10分)
    Meteva——让预报检验不再重复造轮子
  • 原文地址:https://www.cnblogs.com/renxs/p/2649425.html
Copyright © 2011-2022 走看看