.NET技术之美-c#的类型基础

一、值类型和引用类型

值类型

包含:结构和枚举(值类型都隐式的继承自system.ValueType)

 

栈(stack)是一种后进先出的结构、用来处理存放变量

堆(heap)是为了对引用类型实例(对象)分配空间的内存区域,在堆上创建的对象会将其地址传递给变量进行处理

值类型在变量声明的过程中堆栈的操作过程

看下面的代码

public struct ValPoint{
    public int x;
    public ValPoint(int x){
    this.x=x;
      }
}

上面定义了一个值类型

在程序中写下代码

ValPoint valPoint;

则会在栈上创建一个变量valPoint,并且此变量将会包括所有的字段和属性

New操作符

ValPoint valPoint=new ValPoint();

new操作符在值类型实例化一个对象的时候,并不会再堆上创建一个实例,仅仅是作为初始化值类型valPoint变量的字段值,在值类型中都会将值类型中的变量的值初始化为0.

1.=左边ValPoint valPoint,在线程栈上创建一个ValPoint类型的变量vPoint,结构中的所有成员的没有赋值.在进行new ValPoint()之前,将vPoint压到栈上

2.=右边的new ValPoint(),new操作符并不会分配内存,也不是创建实例。它仅仅是调用ValPoint结构的默认构造函数,根据构造函数去初始化vPoint结构的所有字段

 

引用类型

包括:接口、类、委托等

 

引用类型在变量声明的过程中堆栈的操作过程

public class RefPoint{
      public int x;
      public RefPoint(int x){
      this.x=x;
   }
}

在程序中写下代码

RefPoint reflPoint;

声明一个引用类型的变量,在线程栈上创建一个不包含任何地址数据的变量

New操作符

RefPoint reflPoint=new RefPoint(1);

 

 

 

 

 

 

使用new操作符后,在应用程序的堆上创建一个引用类型对象的实例,并为它分配内存地址,自动传递该实例的引用给构造函数

特殊的值类型(简单类型)

包括:int、byte

装箱与拆箱

装箱:将值类型转换为引用类型

装箱的过程

1.在堆上位新生成的对象实例分配内存.该对象实例包含数据,但它没有名称

2.将栈上值类型变量的值可复制到堆上对象中

3.将堆上创建的对象地址返回给引用类型变量

拆箱:将引用类型转换为值类型

 

对象判等

public class RefPoint{
        public int x;
    public RefPoint(int x){
    this.x=x;
  }
}
   public struct ValPoint{
        public int x;
    public ValPoint(int x){
    this.x=x;
  }
}

 

引用类型判等

RefPoint rPoint1=new RefPoint(1);
   RefPoint rPoint2=rPoint;

常量性和原子性

对象复制

浅度复制

1.值类型:复制变量本身或则包括字段的值

2.引用类型:复制引用类型的实例所指向的地址

深度clone复制开辟新内存,clone出来的新对象不会跟着旧对象变就是,浅复制会跟着被复制的对象一起变

举个例子,比如说你银行卡掉了,浅度复制相当于你补办银行卡,取钱存钱都还是在原来的账户里面,只是指向这个账户的银行卡变了,账户还是那个账户。但而深度复制相当于你重新开了个户,把原来的钱存在里面。

posted @ 2015-03-22 11:32  草旅虫  阅读(147)  评论(0编辑  收藏  举报