值类型和引用类型是什么区别

软件工程小施同学 软件工程小施同学     2022-12-22     358

关键词:

1、简单比较

  值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

  值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。

 

 

 引用类型(reference type):string 和 class统称为引用类型。当声明一个类时,只在中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。

 

值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

2、相同点

  • 引用类型可以实现接口,值类型当中的结构体也可以实现接口
  • 引用类型和值类型都继承自System.Object类。

3、不同点

  1)范围方面

  • C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
  • C#的引用类型包括:数组,用户定义的类、接口、委托,object字符串。

  2)内存分配方面

  • 数组的元素不管是引用类型还是值类型,都存储在托管堆上。【注意:托管堆和进程堆,是一种么?另外:线程堆栈(Thread Stack)和托管堆(Managed Heap),日后会再单独涉及】
  • 引用类型中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实 例)存储;作为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

  3)适用场合

  值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

  • 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
  • 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如   int? a = null;  );
  • 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

4)经历使用:

在一个循环中(循环外有一个集合的定义),如果将一个引用类型在循环外声明,然后在循环中赋不同的值,这时运行后,我们会发现集合中的这个引用类型对象的集合都是相同的值。这是因为集合内存储的是同一个在栈上的引用地址,而非具体在堆上的值。

而如果是值类型,无论在循环内外,都可以在集合内赋不同的值,并且储存。

http://www.360doc.com/content/18/1224/18/13328254_804168072.shtml

c#中的引用类型和值类型有啥区别?

】c#中的引用类型和值类型有啥区别?【英文标题】:Whatisthedifferencebetweenareferencetypeandvaluetypeinc#?c#中的引用类型和值类型有什么区别?【发布时间】:2011-06-3017:54:30【问题描述】:几个月前有人问过我这个问题,我无法详细解... 查看详情

swift-值类型和引用类型的区别

在Swift中数据类型分为值类型和引用类型,只有类是引用类型,其他类型都是值类型.那么值类型和引用类型有什么区别呢?值类型是在赋值或给函数传递参数时创建一个副本,把副本传递过去,在函数的调用过程中不会影响原始数据.... 查看详情

什么是int?int和integer有什么区别?

Java提供了两种不同的类型:引用类型和原语类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每种原语类型提供了一个封装类。引用类型的行为与原始类型的行为完全不同,它们具有不同的语义。... 查看详情

值类型和引用类型区别

3、值类型和引用类型区别:存储位置:值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。传递方式:值类型传递实际值,引用类型传递是引用(地址)。值类型存取速... 查看详情

值类型和引用类型的区别(代码片段)

...方博客http://www.cnsendblog.com/index.php/?p=538 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去... 查看详情

值类型和引用类的区别是啥?

值类型和引用类的区别是什么?不要翻版你不会回答就别回答这样我们新人看不懂~(1)值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。(2)引用类型:对象、数组、函数。1、值类... 查看详情

c#在方法调用中,参数按值传递与按引用传递的区别是啥?

基本数据类型作为参数默认按什么方式传递?类对象作为参数默认按什么方式传递?类对象可以按值方式传递吗?基本数据类型参数按引用传递时,应该怎么做?关键字ref和out的区别是什么?1.先来说下C#中的数据类型.分值类型和引用... 查看详情

java中的值传递和引用传递有什么区别呀?

 值传递:    (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行... 查看详情

基本数据类型和引用数据类型的区别是啥

本文介绍“基本数据类型和引用数据类型的区别”1、基本数据类型由于在内存中的一个地址存放的是这些变量的值所以调用函数,函数里的形参,就是复制这些变量的值以后对形参值的变化不会影响到原来变量的值;2、引用数... 查看详情

值类型和引用类型区别,一看就懂

...;本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型:值类型和引用类型; 虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型。 引用类型如:string,Object,class等总是在从... 查看详情

java中的基本类型和引用类型变量的区别

基本类型:基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。引用类型:是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。&nb... 查看详情

javascript中基本类型和引用类型的区别分析

...在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别。下面我们来看一下在JavaScript中基本数据类型(PrimitiveTypes)和引用类型(ReferenceTypes)的区别。、基本类型和引用类型ECMAScript包含两个不同类型的值... 查看详情

引用类型和值类型的区别

1,值类型的数据存放在内存的栈中,引用类型的数据存放在内存的堆中2,值类型存取速度快,引用类型存取速度慢3,值类型表示实际数据,引用类型表示指向存储在内存堆中的数据指针或引用4,值类型的变量直接存放实际的... 查看详情

.NET 中的结构和类有啥区别?

...问题,对我也有帮助。【参考方案1】:在.NET中,有两类类型,引用类型和值类型。结构是值类型,类是引用类型。一般的区别是引用类型存在于堆上,而值类型存在于 查看详情

值类型和引用类型的区别

值类型的变量和引用类型的变量传值的时候的区别:结果是:我们可这样理解:num1就是一个文件,里面存放了123这个数据,然后复制了一份,有了num2文件,那么现在就有2个文件里了,2份数据obj1就是一个文件的快捷方式,这个快... 查看详情

java中值类型和引用类型的区别

JAVA中值类型和引用类型的不同?[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变.值类型表示复制... 查看详情

javascript—基本类型和引用类型的区别

...如下:(一)基本概念JS中可以把变量分成两部分,基本类型和引用类型。基本类型比较简单,包括:Undefined、Null、Boolean、Number和String,基本类型值就是简单的数据段;引用类型值可能由多个值构成的对象。引用类型值保存在... 查看详情

list和arraylist的区别

装箱:在值类型向引用类型转换时发生;拆箱:在引用类型向值类型转换时发生;值类型:直接将内存存储在栈内,由系统自动释放资源的数据类型;引用类型:由类型的实际值引用(类似于指针)表示的数据类型,通俗点说就... 查看详情