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();
    
            }
        }
  • 相关阅读:
    python模板引擎Cheetah的安装
    cocos2d 动作
    【leetcode】合并两个有序数组
    【leetcode】合并二叉树
    【leetcode】合并两个有序链表
    【leetcode】链表的中间结点
    【leetcode】使用最小花费爬楼梯
    【leetcode】栈的最小值
    【leetcode】最小绝对差
    【leetcode】玩筹码
  • 原文地址:https://www.cnblogs.com/jintianzhang/p/4388904.html
Copyright © 2011-2022 走看看