深层次探究值类型与引用类型,以及值传递引用传递

数据类型

类型的分类

所有的类型都可以划分为两类:值类型和引用类型.

  值类型和引用类型的区别在于使用的内存位置不同:值类型数据存储在栈上,而引用类型数据存储在堆上.(至于栈和堆就不在这里多做解释)

  ①.值类型

    值类型在储存时直接包含值,即变量引用的位置就是值在内存中实际存储的位置,可看做是变量的值本身.因此,将第一个变量的值赋给第二

    个值会在新变量的位置创建原始变量的值的一个内存副本.相同值类型的第二个变量不能引用和第一个变量相同的内存地址.所以更改第一

    个变量的值不会影响第二个变量的值.如下图:

    

   类似地,将一个值类型传给一个方法,也会生成一个内存副本.在方法内部对参数值进行任何修改都不会影响调用函数中的原始值.由于值类型要

   求一个内存副本,因此不要让它们消耗太多的内存.(通常应该小于16字节)

   既然这里说到了参数的传递,不得不说一下形参与实参,也可以从这方面理解值类型传递

   1.形参的定义:定义函数名和函数体的时候使用的参数;

   2.形参的作用:实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。没有形

                参的函数在形参表的位置应该写void.main 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时

                初始化,其返回值传递给操作系统.

   3.形参与实参的特点:

      a.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效.函数调用结束返

        回主调用函数后则不能再使用该形参变量

      b.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给

        形参。因此应预先用赋值,输入等办法使参数获得确定值。

      c.实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误

      d.在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参

        中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上

     根据形参和实参的特点我们不难看出:值传递给方法值类型时,可以看做对形参内存的释放,方法体中的语句可视为不存在.

    值类型需要的内存量会在编译时固定下来,而且不会再运行时改变.因为大小固定,所以值类型可以存储在栈的内存区域中.

 

  ②.引用类型

    引用类型和引用它们的变量指向数据存储的位置.引用类型并不直接存储值,它们存储的是对一个内存位置的引用(内存地址),只有在那个位置才

    能找到真正的数据.因此为了访问数据,"运行时"要从变量中读取 内存位置,然后跳转到包含数据的内存位置.引用类型指向的内存区域称为堆.

   

    由于访问引用类型的数据需涉及一次额外的跳转,所以速度会慢一下,然而,由于与值类型不同,其不要求相同数据的内存副本,所以在内存的利用

    率上显得更好.将一个引用类型的变量赋值给另一个引用类型的变量,只会多出一个地址的一个内存副本.所以,引用类型需要的内存副本总是地

    址本身的大小.如果在数据量较大的情况下,由于不需要复制实际的数据,故引用类型比值类型更有效.

    由于引用类型只复制数据的地址,所以两个不同的变量可以引用相同的数据.若其中一个变量更改数据,也会改变另一个变量引用的数据,因此,如

    果在一个方法内部修改引用类型的数据,在调用方那也会发生同样的改动.

       

     图中原来的Y指向的实际位置,即MyClass y 数据的实际内存空间将在CPU空闲时释放.

     在定义一个类时(不含静态成员或变量),一般不会在内存中给其分配一个存储结构,而是在定义对象时才会分配,当利用同一个

     类定义不同对象时,系统会在内存中为不同对象创建不同的存储结构,对应不同的内存地址.

时间: 2024-08-09 11:10:14

深层次探究值类型与引用类型,以及值传递引用传递的相关文章

c#中值类型与引用类型的值传递与引用传递

值类型:结构体,数值类型(int,double,char,),bool型,枚举,可空类型(nullable) 引用类型:数组,用户定义的类.接口.委托,object,字符串 值类型存储在内存里的栈里,引用类型存储在内存里的堆里. 值传递时,形参到实参实质上是栈里的内容复制,引用传递时,形参到实参实质上栈内容地址的复制. 原文地址:https://www.cnblogs.com/lovejingjing/p/11198269.html

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用

C#中值类型和引用类型

本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数据类型(string类型除外):包括整型.浮点型.十进制型.布尔型. 整型(sbyte.byte.char.short.ushort.int.uint.long.ulong ) 浮点型(float 和 double ) 十进制型(decimal ) 布尔型(bool ) 结构类型(struct) 枚

值类型和引用类型及参数传递

值类型和引用类型: C#数据类型分为两大类:值类型和引用类型. 值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型. 引用类型数据主要有:数组,字符串,接口,委托,类. 值类型和引用类型的区别: 引用类型继承自System.Object,值类型继承自System.ValueType. 引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中.在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放. 引用类型可以派生出新的类型,而值类型不可以.

.Net中值类型和引用类型的区别

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,"不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题".这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的

关于接口是值类型还是引用类型的猜测

虽然工作也有几年时间了,但时常能暴露出基础知识薄弱的问题,因此,有空闲时间时总喜欢把缺下的功课补齐. 今天想讨论的是,接口到底是引用类型还是值类型. 要想说清楚接口到底是引用类型还是值类型,就需要先解释一下值类型跟引用类型. 值类型,简单理解就是继承自ValueType的类型,除过可空类型(如int?,bool?)外,值不能为null,通常情况下存储在栈中.而引用类型不从ValueType继承,其值可以为null,存储在托管堆中,由GC负责清理. 既然大致了解了什么是值类型和引用类型,或者说,值

C# 值类型与引用类型 (上)

1. 主要内容 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 2. 基本概念 C#中,变量是值还是引用仅取决于其数据类型. C#的基本数据类型都以平台无关的方式来定义,C#的预定义类型并没有内置于语言中,而是内置于.NET Framework中..NET使用通用类型系统(CTS)定义了可以在中间语言(IL)中使用的预定义数据类型,所有面向.NET的语言都最终被编译为 IL,即编译为基于CTS类型的代码, 通用类型的系统的功能: 建立一个支持跨语言集成.类型安全和高性能代

理解C#值类型和引用类型

网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家. 工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解.这两天花了不少时间查找资料,看文章,终于有所收获,在此将自己理解整理出来,方便日 后自己查看,同时希望对跟我有一样困惑的朋友有所帮助.废话不多说,下面开始说说怎么理解值类型和引用类型! C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用类型只是包含指向存储数据位置的指针. 1.值类型 那么有哪些类型是C#值类型的呢,我把他们归纳成三类: 1)基础数据类型(string

C#中值类型和引用类型的区别浅记

C#中值类型和引用类型的区别浅记 在C#中,变量的类型分为两种,分别是值类型和引用类型. 值类型的变量直接存储值,说得更具体一些,就是值类型变量在内存中直接存储它们自身的值,如代码所示, int x = 2: 值类型变量x,在内存中的某处直接存储了它自身的值:2. 引用类型的变量存储的是对其对象的引用,更进一步说,就是引用类型变量在内存中直接存储了一个指向它处的引用,而引用所指的对象则保存在引用类型变量所指的内存中.如代码所示, public class Thing { int x; } Thi