值类型和引用类型的详细讨论

Posted redlkop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值类型和引用类型的详细讨论相关的知识,希望对你有一定的参考价值。

值类型:(原话定义)值类型的变量直接包含值,换言之变量引用的位置就是值在内存中实际存储的位置。

这句话也就是说,值类型的赋值是不会引用同一内存位置的,除了out和ref参数,更改原始变量不影响其它变量的值(因为变量歌有各的位置)

依次向下:

int number1 =42;

char letter =\'A\';

float pi = 3.14;

int number2 = number1;

总结:值类型的赋值会单独开辟一个新的内存空间,这就引发了另两个问题,第一个是空间占用问题,所以,规范是不要创建内存大于16字节的值类型。第二个问题,由于值类型的值一般只能短时间存在,大多情况下,值类型的值和临时值是存储在称为栈的临时存储区中,然而,临时区清理的代价低于需要进行垃圾回收的堆,但是,值类型会更加频繁地去复值,增加性能开销,这点得注意;

引用类型:它得值是对一个对象的实例的引用,引用类型的变量是引用(通常是内存地址),去那个位置找到对象实例的数据。因此,”运行时“要从变量读取引用,然后根据引用找到资源,从而到达实际包含实例数据的内存位置。即引用类型的变量关联了两个存储位置。

引用类型指向堆,但是引用类型与变量关联的存储位置和值类型并没有区别;若变量短时间存在,就在临时存储区分配它,对于引用类型的变量,它的值要么是null,要么是对需要进行垃圾回收的堆上的一个存储位置的引用。

总结:由于引用类型只复制对数据的引用,因此两个变量客引用相同的数据,这样,赋值和方法调用都将改变相同引用变量的值;

 

 

 

以上是关于值类型和引用类型的详细讨论的主要内容,如果未能解决你的问题,请参考以下文章

值类型和引用类型,栈和堆的含义

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

值类型和引用类型只是 c# 概念?

java引用传递和值传递

关于值类型和引用类型

4.1 基本类型和引用类型的值JavaScript高级程序设计第三版