• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
小小松
学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
博客园    首页    新随笔       管理     
.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 需要判断对象的类型,以定位类型的方法表。

 

学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
posted on 2012-08-21 17:19  小小松  阅读(420)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3