四 装箱与拆箱

 

前面主要都讨论的是同类型直接的转换,引用到引用,值类型到值类型。还有一种用的非常多的就是引用类型和值类型之间的转换,比如传递参数时,值类型存储到一个引用类型时。也就是经常可以听到的装箱和拆箱操作。这确实是个非常复杂的地方。因为引用类型和值类型的内存空间是不同的,也就导致了许多性能问题和拷贝使用等问题。对于每一种值类型,运行库都提供一种相应的已装箱类型,这是与值类型有着相同状态和行为的类。当需要已装箱的类型时,某些语言要求使用特殊的语法(如C++要用关键字);而另外一些语言会自动使用已装箱的类型(C#是自动的)。在定义值类型时,需要同时定义已装箱和未装箱的类型。

  1. 由前面我们可以知道,值类型是分配在线程的堆栈上,而引用类型是分配在托管堆上的。所谓的‘装箱’也就是把值类型转化为一个引用类型的过程。实际上也就是把分配在堆栈上的对象,装箱(可能说打包比较形象,前面说过分配在托管堆的对象回又个附加成员),然后重新分配到托管堆上的。装箱操作通常由以下几步组成:
    在托管堆上为新生成的引用类型分配内存空间。这个空间大小为值类型本身大小和附加成员(方法表指针和SyncBlockIndex)
  2. 将值类型实例的字段拷贝到托管堆上新分配对象的内存中。
  3. 返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用。值类型实例也就变成了一个引用类型对象。
//声明一个值类型
struct Point
{
  public Int32 x,y;
}


class app
{
 static void Main()
 {
   ArrayList a = new ArraryList();
   Point p ;            //值类型分配到线程堆栈上
   for(Int32 i = 0; i < 10 ;i++)
   {
      p.x = p.y = 1;    //初始化值类型成员
      a.Add(p);         //Add(Object obj)方法要接受一个引用类型,所以会对p进行装箱操作。
   }
 }
}

继续阅读

0

这段时间在学习的过程中,也看了其他不少人写的读书笔记,感觉每个地方都有好多东西可以写很多内容。但鉴于目前自己是在第一次学习阶段,很多地方无法弄的太深。此笔记也主要是对每一块内容学习的一个总结,每次在写笔记时,我觉得自己都会有新的收获,了解的更清楚。希望随着学习的深入也能写一些有深度的东西。最近这几天晚上上不了网,而且太累,导致耳鸣了一两天,所以今天才写笔记。以后每天还是早点睡觉,身体是革命的本钱啊!

 

一 类型基础

 

在.net里,FCL中定义了很多的类型,CLR的要求是每个类型都要继承自System.Object这个类型。在我们定义一个类行的时候,往往是隐式继承于Object的。Object这个类型定义了四个公有的实例方法和两个受保护的方法,而系统中所有类型都能使用这些通用的方法。

  • Equals: 此方法是判断两个对象的值是否相同的。在Object中的实现是判断两个对象是否指向同一个对象。而在派生类中,主要用于判断值是否相等。其中引用类型和值类型是不同的。自己定义的类型要判断时需要重写此函数。
  • GetHashCode:这个方法是返回对象的散列码。如果一个对象被用作散列表的一个键值,那么该对象的类型应该重写此方法。
  • Tostring:此方法默认情况下是返回一个类型的全名。另一种常见的用法就是重写该方法让它返回一个表示对象状态的字符串。还可以通过重写他来得到一个表示对象字段值的字符串。
  • GetType:方法返回一个类型为继承自Type的对象实例,标识了该方法所属对象的类型。此方法是一个非虚方法,可以防止派生类重写此方法而隐瞒实际的类型,破坏类型安全。
  • MemberwiseClone:这也是个非虚方法,他是创建一个新的类型实例,并将去字段设置为和this对象的字段相同。最后返回创建实例引用。后面的深拷贝时回用到此方法。
  • Finalize:这是一个虚方法,当垃圾回收齐判定某个对象为可回收的垃圾时,垃圾回收器回在对象被回收前调用此方法。此方法很重要。后面学习中还会具体涉及。

CLR要求每个对象都需要用new来创建,new的话系统会执行一系列的内存等分配工作。但要注意的是CLR中没有提供delete这样一个关键字来手动的释放内存,因为这些都是由垃圾回收器来完成的。也许有人会奇怪,我们平时定义一些简单的数值变量的时候并没有用new,只是在定义类的时候才用。这就引出了后面的话题。.net中的数据类型

 

继续阅读

0

为了得到一些东西,我们必须放弃一些东西,在每个人的人生天平上,孰重孰轻,只有我们自己知道,但是一旦选择了,我们就要尽量去做好它,保留我们内心中那少少值得骄傲的地方。

                                                                                                                                                                                                        ——————————-学习题记

看到小麟写的很好,就拿过来。大家一起共勉。毕业到工作,有4个月了,突然发现有些不是自己想要的。即便现在的环境和安逸和轻松。谈到.net,或许自己连个菜鸟都算不上。但,为了做自己喜欢的事,从现在起,我努力把自己变为一只菜鸟。《.net框架程序设计》是一本非常好的书,我通过学习此书,顺便做点笔记,尽量用自己的理解。笔记中或许会有许多错误,有许多不正确的认识。也请新人,菜鸟,老鸟,高手们多多指教。

 

一 平台介绍

 

NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。

公共语言运行库是 .NET Framework 的基础。公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。

.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。

继续阅读

0