引用类型

C#引用类型和值类型的区别

情到浓时终转凉″ 提交于 2019-12-18 09:03:20
我们都知道, c# 的两大数据类型分别为值类型和引用类型。很多人或许闭着眼睛都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用 struct 什么时候用 class 时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。 值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。 从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由 GC 来控制其回收,需要进行地址转换,效率降低,这也正是 c# 需要定义两种数据类型的原因之一。 值类型均隐式派生自 System.ValueType ,而 System.ValueType 又直接派生于 System.Object, 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封( sealed )的,所以无法派生出新的值类型。而且 System.ValueType 本身是一个类类型,而不是值类型,因为它重写了 object 的 Equals() 方法

关于值类型和引用类型的区别

不想你离开。 提交于 2019-12-18 05:20:55
C# 数据类型分为两大类:值类型( 数据存放在栈 stack 中 )和引用类型( 数据存放在堆 heap 中,地址存放在栈 stack 中 )。下图是列举了两种数据类型的数 值类型变量声明后,不管是否已经赋值,编译器为其分配内存。声明一个引用类时, 只在栈中分配内存,用于存放地址,而并没有为其分配堆上的内存空间。 值类型与引用类型使用区别: 本部分主要以自己编写程序来体验两者区别。 对象的传递: 输出结果: 将值类型的变量赋值给另一个变量,会执行一次赋值,赋值变量包含的值; 将引用类型的变量赋值给另一个引用类型变量,它复制的是引用对象的内存地址,在赋值后就会多个变量指向同一个引用对象实例。 参数按值传递: 输出结果: 对于值类型 (stu1) ,传递的是该值类型实例的一个副本,因此原本的值 stu1 并没有改变; 对于引用类型 (Student stu2) ,传递是变量 stu2 的引用地址(即 stu2 对象实例的内存地址)拷贝副本,因此他们操作都是同一个 stu2 对象实例。 参数按引用传递: 输出结果: 不管是值类型还是引用类型,可以使用 ref 或 out 关键字来实现参数的按引用传递。 ref 或 out 关键字告诉编译器,方法传递的是参数地址,而非参数本身。 在按引用传递时,方法的定义和调用都必须显式的使用 ref 或 out 关键字,不可以省略,否则会引起编译错误 注

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

我的未来我决定 提交于 2019-12-18 03:05:45
1、 Java 中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 byte,short,int,long 2,浮点型2种 float,double 3,字符型1种 char 4,逻辑型1种 boolean [引用类型] 除了四类八种基本类型外,所有的类型都称为引用类型(数组,类,接口,字符串) 在弄清楚值类型与引用类型之后,最后一点就是值传递与引用传递,这才是关键 [值传递] 基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。 [引用传递] 引用类型之间赋值属于引用传递。引用传递传递的是对象的引用地址,也就是它的本身(自己最通俗的理解)。 引用传递:传的是地址,就是将实参的地址传递给形参,形参改变了,实参当然被改变了

String类能被继承吗,详解

廉价感情. 提交于 2019-12-17 16:48:43
String 类是不允许被继承的,因为他被final关键字修饰的。 String 类型其实是被char[]数组存储的,而这个数组也是被final修饰的 图片转自: https://blog.csdn.net/zhangyubishoulin/article/details/82459855 1.final类 不能被继承 2.final类中的方法,不能覆写只能继承 3.修饰变量 3.1 类成员变量 只能在初始化或在构造器(构造方法)中赋值一次,修饰引用类型时引用指针不变,变量内容可变 3.2 局部变量 只能在初始化中赋值一次,修饰引用类型时引用指针不变,变量内容可变 4修饰方法参数 方法的值在方法中不能被修改,引用类型内容可变 1.由于finalize() 在对象回收前会被调用所以finalize()方法在有些地方会被用来关闭外部资源。 2.由于finalize()方法调用的不确定性,所以强烈不建议使用finalize0方法来关闭外部资源。 3.能使用finalize()方法来关闭的外部资源,使用try-finally,来关闭可以做的更好、更及时。 try-finally不会运行的情况 1.JVM虚拟机停止运行( System.exit(0) ) 2.线程被interrupted or killed 3.服务器断电、关机 来源: CSDN 作者: HANG10086 链接:

关于Java的Object.clone()方法与对象的深浅拷贝

人走茶凉 提交于 2019-12-17 08:32:50
文章同步更新在个人博客: 关于Java的Object.clone()方法与对象的深浅拷贝 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理。这时候就可以用到Java中的Object.clone方法进行对象复制,得到一个一模一样的新对象。但是在实际使用过程中会发现:当对象中含有可变的引用类型属性时,在复制得到的新对象对该引用类型属性内容进行修改,原始对象响应的属性内容也会发生变化,这就是"浅拷贝"的现象。关于浅拷贝,Object.clone()方法的描述也有说明: /** * Creates and returns a copy of this object. The precise meaning * ... * The method {@code clone} for class {@code Object} performs a * specific cloning operation. First, if the class of this object does * not implement the interface {@code Cloneable}, then a * {@code CloneNotSupportedException} is thrown. Note that all arrays * are considered to

内存管理(13)——(c#) 销毁资源和释放内存

☆樱花仙子☆ 提交于 2019-12-16 18:40:57
0. 什么是资源? .NET 框架中如何访问资源? 所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。 在面向对象的环境中,每一个类型都标识为某些程序所用的资源,要想使用这些资源,必须为相应的类型分配一定的内存空间。 访问一个资源需要如下几个步骤: 1)分配内存空间: 调用中间语言(IL)中的newobj指令(使用new操作符时,将产生newobj指令),为某个特定资源的类型分配一定的内存空间。 2) 初始化内存: 一个类型的实例构造器负责这样的初始化工作。 3)使用资源: 通过访问类型成员来使用资源。根据需要会有反复。 4)销毁资源: 执行清理工作。 5)释放内存: 托管堆上的内存由GC全权负责, 值引用的在栈上的内存会随着栈空间的消亡而自动消失。 1. 什么是托管资源,非托管资源? 托管资源是由CLR全权负责的资源,CLR不负责的资源位非托管资源。 对于托管资源通过GC自动回收。 对于非托管资源GC管理,通过代码调用手动进行清除。 2. 什么是垃圾, 什么是垃圾回收? Net类型分为两大类,一个就是值类型,另一个就是引用类型。前者是分配在栈上,并不需要GC回收;后者是分配在堆上,因此它的内存释放和回收需要通过GC来完成, 那么只有被称为垃圾的对象才能被GC回收。也就是说,一个引用类型对象所占用的内存需要被GC回收,需要先成为垃圾。 那么

深入理解 Java 基本数据类型

点点圈 提交于 2019-12-16 17:43:11
📓 本文已归档到:「 javacore 」 1. 数据类型分类 Java 中的数据类型有两类: 值类型(又叫内置数据类型,基本数据类型) 引用类型(除值类型以外,都是引用类型,包括 String 、数组) 1.1. 值类型 Java 语言提供了 8 种基本类型,大致分为 4 类 整数型 byte - 8 位。 short - 16 位。 int - 32 位。 long - 64 位,赋值时一般在数字后加上 l 或 L 。 浮点型 float - 32 位,直接赋值时必须在数字后加上 f 或 F 。 double - 64 位,赋值时一般在数字后加 d 或 D 。 字符型 char - 16 位,存储 Unicode 码,用单引号赋值。 布尔型 boolean - 只有 true 和 false 两个取值。 1.2. 值类型和引用类型的区别 从概念方面来说 基本类型:变量名指向具体的数值。 引用类型:变量名指向存数据对象的内存地址。 从内存方面来说 基本类型:变量在声明之后,Java 就会立刻分配给他内存空间。 引用类型:它以特殊的方式(类似 C 指针)向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。 从使用方面来说 基本类型:使用时需要赋具体值,判断时使用 == 号。 引用类型:使用时可以赋 null,判断时使用 equals 方法。 👉 扩展阅读:

swift学习之类和结构体

ぃ、小莉子 提交于 2019-12-16 10:53:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 类和结构体对比 Swift 中类和结构体有很多共同点。共同处在于: 定义属性用于存储值 定义方法用于提供功能 定义下标操作使得可以通过下标语法来访问实例所包含的值 定义构造器用于生成初始化值 通过扩展以增加默认实现的功能 实现协议已提供某种标准功能 与结构体对比类还有如下的附加功能: 类可以继承 类允许在运行时检查和解释一个类实例 的类型 类的析构器允许个类实例释放任何其所分配的资源 引用计数允许对一个类的多次引用 注意:结构体总是通过被复制的方式在代码中传递,不适用引用计数。这是类和结构体的区别之一 类和结构体都可以使用点语法访问其属性。 注意:与Objective-C不同,Swift允许直接设置结构体的子属性的值。比如在OC中 tableView.frame.origin.x = 200这种写法就会报语法错误,而在Swift中则不会。 结构体都一个自动生成的成员逐一构造器,用于初始化结构体实例中的属性。如: CGRect.init(origin: , size: ) 然而类却不会自动生成。 结构体和 枚举 是值类型的 值类型被赋予一个变量,常量或者当做参数传递给函数的时候,其值会被拷贝。 在 Swift 中,所有的基本类型:整数(Integer)、浮 点数(floating-point)、布尔值

CLR via C# 引用类型和值类型

扶醉桌前 提交于 2019-12-16 06:15:53
CLR支持两种类型:引用类型和值类型。虽然FCL的大多数类型都是引用类型,但程序员用得最多的还是值类型。 引用类型总是从托管堆分配,C#的new操作符返回对象内存地址---即指向对象数据的内存地址。 //-- 使用引用类型必须留意性能问题。首先要认清楚以下四个事实: 1.内存必须从托管堆分配。 2.堆上分配的每个对象都有一些额外成员,这些成员必须初始化。 3.对象中的其他字节(为字段而设)总是设为零。 4.从托管堆分配对象时,可能强制执行一次垃圾回收。 //-- 如果所有类型都是引用类型,应用程序的性能将显著下降。 为了提升简单和常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。 值类型的实例一般在线程栈上分配(虽然可以作为字段嵌入引用类型的对象中)。 在代表值类型实例的变量中不包含指向实例的指针。相反,变量中包含了实例本身的字段。由于变量已包含了实例的字段,所以操作实例中的字段不需要提领指针。 值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆的压力,并减少了应用程序生存期内的垃圾回收次数。 //-- 任何称为“类”的类型都是引用类型。相反,所有值类型都称为结构或枚举。 所有结构都是抽象类型System.ValueType的直接派生类。System.ValueType本身又直接从System.Object派生。 根据定义,所有值类型都必须从System

比较 两个Integer 的大小

你说的曾经没有我的故事 提交于 2019-12-15 09:37:03
比较 两个Integer 的大小 1 Integer a = 1 ; 2 Integer b = 1 ; 3 if ( a == b ) { 4 System . out . print ( "a等于b" ) ; 5 } else { 6 System . out . print ( "a不等于b" ) ; 7 } 基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的内存地址 由于Integer是引用类型的,所以在使用==比较的过程中我们只要去判断a,b的指向的内存地址是不是相等的就行了 陷阱 :一般来说,a,b在生成并复制的时候,由系统在内存去分配空间,存储的值分别为1,1 a,b分别为对应的地址指针。但是 为什么会相等,原因在于,integer在初始化的时候会有一个缓存,可以看成常量池,-128-127 中的数都在,例如 1即可直接在常量池中获取,而此时的a,b都为1这个地址的引用,所以是一样的 来源: CSDN 作者: 山和人海 链接: https://blog.csdn.net/weixin_44793886/article/details/103531408