zoukankan      html  css  js  c++  java
  • C#值类型与引用类型

     

    值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据。其在MSDN的定义为值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。我们由上图可知,值类型主要包括简单类型、结构体类型和枚举类型等。通常声明为以下类型:int、char、float、long、bool、double、struct、enum、short、byte、decimal、sbyte、uint、ulong、ushort等时,该变量即为值类型。 

    引用类型(Reference Type),引用类型实例分配在托管堆(managed heap)上,变量保存了实例数据的内存引用。其在MSDN中的定义为引用类型存储对值的内存地址的引用,位于堆上。我们由上图可知,引用类型可以是自描述类型、指针类型或接口类型。而自描述类型进一步细分成数组和类类型。类类型是则可以是用户定义的类、装箱的值类型和委托。通常声明为以下类型:class、interface、delegate、object、string以及其他的自定义引用类型时,该变量即为引用类型。

    namespace codeTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义值类型和引用类型,并完成初始化
                MyStruct myStruct = new MyStruct();
                MyClass myClass = new MyClass();
    
                //定义另一个值类型和引用类型,
                //以便了解其内存区别
                MyStruct myStruct2 = new MyStruct();
                myStruct2 = myStruct;
    
                MyClass myClass2 = new MyClass();
                myClass2 = myClass;
            }
        }
    
        struct MyStruct
        {
            public int x = 100;
        }
    
        class MyClass
        {
            public int x = 100;
        }
    }

    数据在内存中的分配位置,取决于该变量的数据类型。由上可知,值类型通常分配在线程的堆栈上,而引用类型通常分配在托管堆上,由GC来控制其回收。例如

  • 相关阅读:
    做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
    Go实现ssh执行远端命令及远程终端
    Go加密算法总结
    Vue项目上线环境部署,项目优化策略,生成打包报告,及上线相关配置
    博客园代码折叠
    win10关闭锁屏,直接进入登录界面

    多路查找树
    树结构的应用
    二叉树
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/4750969.html
Copyright © 2011-2022 走看看