zoukankan      html  css  js  c++  java
  • 值类型和引用类型的总结

    一、栈和堆的理解

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

    二、值类型

    值类型包括了结构、枚举和一些简单类型如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.将值从堆上的变量中复制到堆栈上的值变量中;

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

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

  • 相关阅读:
    2010年7月29日_周四_Working with CallbackResults
    2010年7月19日_周一_Using the Common Data Source API in a Web application
    2010年7月20日_周二_Accessing ArcGIS Server from a Web application
    Flex代码自动换行(自动格式化)
    2010年7月21日_周三_Developing a scriptable Web ADF control
    2010年7月30日_周五_ASP.NET callback solution
    2010年8月02日_周一_map control
    SDE数据库的异地部署
    2010年7月27日_周二_introduction_to_web_controls
    ICE在VC中的配置
  • 原文地址:https://www.cnblogs.com/xhkongblog/p/7824945.html
Copyright © 2011-2022 走看看