zoukankan      html  css  js  c++  java
  • 似曾相识?值类型与引用类型的区别及其转换


       值类型与引用类型的区别


    在上一篇中,简单的总结了下值类型与引用类型的基本概念.下图是总结的一张表




    关于内存的分配问题,这些堆和栈的概念,我都是不是很懂.类似一个篮子,里面可以放各式各样的东西.这里就是用来放置

    不同类型的数据,先大致这样来理解下.以后要用到的时候再去研究,如果有兴趣大家看看这个堆栈或许能明白.

    主要区别


    值类型的变量包含自身的数据,而引用的数据类型包含指向数据的内存块引用.读到这里,让我想起了VB时代里,byref和

    byval.这两种不同的传值方式.接着来说值类型和引用类型,值类型对于每个变量都有一份自己的数据拷贝,则在使用数

    据的时候,不会因为对一个数据的操作去影响另一个数据;而在引用类型中,可以通过对一个变量的操作来影响另一个变

    量的引用的对象.

    来看一个例子,或许更生动点

    namespace _1  
    {  
        class ValueClass            //定义类  
        {  
            public int value = 0;  
        }  
        class ValueAndRefType            //定义类  
        {  
            public static void Main()    //方法  
            {  
                int a = 0;              //a的初始变量未整型0  
                int b = a;  
                b = 10;  
                ValueClass ref1 = new ValueClass();    //创建类对象ref1  
                ValueClass ref2 = ref1;               //创建类对象ref2,并赋值ref1  
                ref2.value = 10;  
                Console.WriteLine("Value:{0},{1}", a, b);     //对变量ref2重新赋值  
                Console.WriteLine("Refs:{0},{1}", ref1.value, ref2.value); //通过ref2重新赋值,影响了ref1和ref2所引用对象  
            }  
        }  
    }  
    运行结果:
                         Value:0,1
                         Refs:10,10

    在这里例子中,大家看到对局部变量a、b初始化后,b重新赋值并没有影响a的值。a仍然是0.而当我们将ref2的值赋上

    10后,则影响了ref1和ref2所引用的对象,也就影响了ref1的值。也就出现了refs:10,10.


    装箱和拆箱


    装箱就是将值类型转换为引用类型,反之就是将引用类型转换为值类型。类似于VB中的转换函数。


    装箱操作


    将值类型转换为object类型,是一个数值分配给一个对象实例,并将这个数值拷贝到新对象中。

    int num =2012;

    object obj =num;

    如上,创建一个整数类型的变量num后。第二行中,就将其拷贝到obj的引用类型中。上述的语句就是在堆栈种创建一

    个对象obj,而该对象引用了堆栈上的int类型数值。


    拆箱操作


    也即是将obj类型转换为值类型。

    int num=2012;

    object obj=num;

    int num1=(int)obj;

    比较着两段代码,大家可以看到。在拆箱过程中,仅仅多了最后一个强制转换。这是为什么呢?哦,这是因为在

    拆箱情况下,一个对象可以强制转换到任何类型。因此必须使用强制转换。


    综上,无论是值类型与引用类型的区别还是转换。大家都可以从VB的知识中,找到相关的影子。在接下来的学

    习中,应该会有很多的知识都是可以联系到我们的VB知识的。有种似曾相似,原来就是你!

  • 相关阅读:
    匈牙利算法(二分图匹配)
    匈牙利算法(二分图匹配)
    Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存
    大数据的五大误区及其破解之道
    大数据的五大误区及其破解之道
    统计之 - 协方差_数据分析师
    统计之 - 协方差_数据分析师
    数据挖掘之七种常用的方法_数据分析师
    数据挖掘之七种常用的方法_数据分析师
    方差分析一般线性模型
  • 原文地址:https://www.cnblogs.com/guziming/p/4232763.html
Copyright © 2011-2022 走看看