zoukankan      html  css  js  c++  java
  • CLR值类型和引用类型

    知识点:引用类型、值类型、装箱、拆箱

    CLR支持两种类型:引用类型和值类型。引用类型在堆上分配内存,值类型在线程栈上分配内存。值类型与引用类型如下所示:

     

    值类型对象有两种表示形式:未装箱和已装箱。将一个值类型的变量付给另一个值类型变量,会执行一次逐字段的复制。

    装箱:将一个值类型转换为一个引用类型称为装箱。装箱会发生如下操作:

    1、在托管堆中分配好内存。分配的内存大小等于值类型各个字段需要的内存大小之和加上类型对象指针和同步块索引需要的内存量。

    2、值类型的字段复制到新分配的堆内存。

    3、返回对象的地址。

    拆箱:将一个引用类型转换为值类型,首先值类型的内存分配在线程栈中,而引用类型的内存分配在托管堆中,所以需要把引用类型中的所有字段都复制到线程栈中。CLR通过两个步骤来完成这个复制操作。

    1、获取已装箱的对象中的各个字段的地址。这个过程称为拆箱。

    2、将这些字段包含的值从托管堆复制到线程栈中。

    通过下面例子来深入理解装箱和拆箱:

    internal struct Point
        {
            private int _x, _y;
    
            public Point(int x = 0, int y = 0)
            {
                _x = x;
                _y = y;
            }
    
            public void Change(int x = 0, int y = 0)
            {
                _x = x;
                _y = y;
            }
    
            public override string ToString()
            {
                return string.Format("{0},{1}",_x,_y);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Point p = new Point(x:1,y:1);
                Console.WriteLine(p);
                p.Change(x:2,y:2);
                Console.WriteLine(p);
                Object o = p;
                Console.WriteLine(o);
                ((Point)o).Change(x:3,y:3);
                //这个执行结果是多少?为什么?
                Console.WriteLine(o);
                Console.ReadLine();
    
            }
        }
  • 相关阅读:
    scala中 object 和 class的区别
    scala中的apply方法与unapply方法
    Scala中的样例类详解
    Scala 中下划线的一些魔法
    Hadoop搭建配置参数调优
    设置ESX/ESXi中(Linux)虚拟机从U盘引导启动
    CentOS下编译安装Busybox
    LRU算法简单实现
    Spark 3.0 动态分区裁剪(Dynamic Partition Pruning)
    Hive中的数据分桶以及使用场景
  • 原文地址:https://www.cnblogs.com/jintianzhang/p/4388904.html
Copyright © 2011-2022 走看看