值类型和引用类型的总结

一、栈和堆的理解

栈是一种后进先出的数据结构,在内存中,变量被分配在栈上进行操作;堆是用来为对象分配空间的一块内存区域,在堆上创建一个对象时,会将对象的地址传递给栈上的变量,反过来叫变量引用该对象。

二、值类型

值类型包括了结构、枚举和一些简单类型如int、byte等,所有的值类型都隐式继承自System.ValueType这个类类型,而这个类型和引用类型全都继承自System.Object基类。

因为结构隐式继承自System.ValueType类型,所以结构不再支持继承。值操作在栈上进行,值操作是一种入栈出栈的过程。要想调用结构中的方法或变量时,需要对结构中的变量进行复赋值后才可使用。例如:

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Student std=new Student();
            Console.WriteLine(std.count);
            Console.ReadKey();
        }
    }
    public struct Student
    {
        public int count;
        public void Listen()
        { }
    }
}

代码中,Student std=new Student();是编译器隐式为结构创建无参数的构造函数,在构造函数中会对结构中的变量进行初始化,这样我们就省去了对结构中的变量逐一初始化。

这里,New操作符不分配内存,也不创建实例,只是调用了默认的构造函数来初始化结构中的所有字段。

三、引用类型

引用类型包括类、接口、委托等。

声明一个引用类型变量时,使用New操作符创建引用实例的时候,该变量被分配到线程栈上,变量保存了堆上的地址。当使用“==”对引用类型变量比较时,实际上是比较两个引用类型是否指向堆上的同一对象。

说明:string是一种特殊的引用类型。

四、装箱和拆箱

装箱:值类型转换成等价的引用类型。

大体过程:

1.在堆上为新生成的对象实例分配内存;

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

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

例如:

int i=1;
object boxed = i;
Console.WriteLine(boxed);

拆箱:将引用类型转换成值类型。

过程:

1.获取已装箱的对象地址;

2.将值从堆上的变量中复制到堆栈上的值变量中;

注意:频繁的在堆上进行操作将会大大消耗内存,因此在编程中尽量避免装箱拆箱过程。

 

 

女猿一枚,为生活而不断拼搏,相信努力定会有收获!

posted @ 2017-11-13 09:46  梦扬2017  阅读(747)  评论(0编辑  收藏  举报