值类型和引用类型的区别

合集下载

总结的U3D面试题

总结的U3D面试题

总结的U3D⾯试题1.配置Unity 3d调试环境?1) Visual Studio Tools for Unity3)安装对应的版本4)使⽤⽅法(⽣成项⽬⽂件,如何调试)2.Array(数组)和List<T>的异同点?相同点:1)存储⼀组类型相同的数据2)都可以通过”[i]”数组访问符获取内部数据不同点:Array声明时需要指定固定的⼤⼩,且以后再也⽆法改变⼤⼩;List<T>声明时⽆需设定⼤⼩,且以后可以Add和Remove元素。

答案⼆、int[]--->数组,只能放int类型的元素,并且必须定长度ArrayList-->集合的⼀种,其中可以放任何类型,不受限制,长度可变,⾃增加长度List--->集合的⼀种,其中只能放相同类型的数据,长度可变,增长度3.Unity3D常⽤的组件有哪些?1)Transform组件(Transformers变形⾦刚)2)Camera 摄象机组件3)Collder碰撞器组件4)Renderer 渲染器组件(Teach---Teacher)5)RigidBody刚体组件6)CharacterController⾓⾊控制器组件7)AudioListener⾳频监听器(⽿朵)8)AudioSource⾳频源(喇叭)4.Unity3D⾥的游戏对象(GameObject)有哪些属性?1)name 名字作⽤:对对象进⾏标识2)tag 标签作⽤:对对象进⾏分组(Group)3)layer 层作⽤:1.射线投射2.摄象机裁剪5.Unity3D 中实现UI有哪⼏种技术?1)GUI(绝对布局),GUILayout(⾃动布局)特点:只能在OnGUI函数中使⽤。

2)NGUI (Next-Gen UI)中⽂:下⼀代通⽤的UI系统特点:80%的游戏都采⽤3)UGUI (Unity3D GUI)GUI:Game User Interface特点:开发者就是NGUI的原班⼈马6.NGUI的UI动画怎么实现?动画:在⼀段时间以内,对象的某个属性值从⼀个状态过渡到另外⼀个状态。

C#中的参数传递:值类型(valuetype)和引用类型(referencetype)

C#中的参数传递:值类型(valuetype)和引用类型(referencetype)

C#中的参数传递:值类型(valuetype)和引⽤类型(referencetype)摘要:由于在.NET中存在两种类型,分别是值类型(value type)和引⽤类型(reference type),所以很多关于C#中参数传递的混淆就因此⽽⽣。

本⽂⾸先从值类型和引⽤类型的辨析⼊⼿,然后解释了在C#中的参数传递的四种形式:值传递(默认形式)、ref传递、out传递、params传递。

⾸先要弄清楚的是:值类型是分配在栈(stack)上⾯,⽽引⽤类型分配在堆(heap)上⾯。

栈是⼀种先进后出,并且由系统⾃动操作的存储空间。

⽽堆(在.NET上准确的说是托管堆 Managed Heap)是⼀种⾃由储存区(Free Memory),在该区域中,必须明确的为对象申请存储空间(⼀般在Java和C #中都是使⽤的new关键字),并可以在使⽤完以后释放申请的存储空间(Java和C #都使⽤垃圾回收机制Garbage Collector⾃动释放对象空间)引⽤类型(reference type):它存放的值是指向数据的引⽤(reference),⽽不是数据本⾝。

⽰例:System.Text.StringBuilder sb = new StringBuilder();这⾥,我们声明⼀个变量sb,并通过new StringBuilder()创建了⼀个StringBuilder(与Java中StringBuffer类似)对象,再将对象的引⽤(reference)赋值给变量sb,即变量sb中保存的是StringBuilder对象的引⽤,⽽⾮对象本⾝。

System.Text.StringBuilder first = new StringBuilder();System.Text.StringBuilder second = first;这⾥,我们将变量first的值(对⼀个StringBuilder对象的引⽤)赋值给变量second,即first和second都指向同⼀个StringBuilder对象。

类和结构体的区别

类和结构体的区别

类和结构体的区别1. class和structure很相似,从技术层面讲,class是引用,而structure则是数值.有人很形象的说class里有行动,方法,成员,是有机体的结合,而structure则是活生生的有机体,2. 通俗的理解,class包涵structure, class里有方法拉,成员拉,什么滴,而structure只有数据,二 .类与结构的差别%%%类成员默认是private,而结构体默认是 public。

1.值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。

所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用2.继承性结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样例如:结构实现接口interface IImage{void Paint();}struct Picture : IImage{public void Paint(){// painting code goes here}private int x, y, z; // other struct memb ers}3.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有 abstract 和 sealed(因为不能继承) 不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用 abstract 和 sealed有protected 修饰符必须使用new 初始化三.如何选择结构还是类讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。

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

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

java基本数据类型和引⽤数据类型的区别⼀、基本数据类型:byte:Java中最⼩的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0int:整型,⽤于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0Lfloat:浮点型,在内存中占32位,即4个字节,⽤于存储带⼩数点的数字(与double的区别在于float类型有效⼩数点只有6~7位),默认值0 double:双精度浮点型,⽤于存储带有⼩数点的数字,在内存中占64位,即8个字节,默认值0char:字符型,⽤于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空boolean:布尔类型,占1个字节,⽤于判断真或假(仅有两个值,即true、false),默认值false⼆、Java数据类型基本概念:数据类型在计算机语⾔⾥⾯,是对内存位置的⼀个抽象表达⽅式,可以理解为针对内存的⼀种抽象的表达⽅式。

接触每种语⾔的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语⾔,所以Java对于数据类型的规范会相对严格。

数据类型是语⾔的抽象原⼦概念,可以说是语⾔中最基本的单元定义,在Java⾥⾯,本质上讲将数据类型分为两种:基本类型和引⽤数据类型。

基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语⾔本⾝定义,它表⽰了真实的数字、字符和整数。

引⽤数据类型:Java语⾔本⾝不⽀持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型⼀般都是通过类或接⼝进⾏构造,类提供了捆绑数据和⽅法的⽅式,同时可以针对程序外部进⾏信息隐藏。

引用类型及其含义

引用类型及其含义

引用类型及其含义引用类型是计算机编程领域中的一个重要概念,它在现代编程语言中得到广泛应用,包括Java、Python、C++等主流语言。

引用类型是一种与值类型相对的数据类型,它的含义是在内存中存储的是一个对象的地址而不是实际的对象本身。

在这篇文章中,我们将详细探讨引用类型的特点、用途和含义。

引用类型的特点1.内存中存储的是对象的地址:与值类型不同,引用类型在内存中存储的是一个指向实际对象的地址。

这意味着引用类型的变量实际上只是一个指向内存中某个位置的指针,通过这个指针可以访问到对象的属性和方法。

2.动态分配内存:引用类型的对象通常是在运行时动态分配内存的。

这使得引用类型具有灵活性和动态性,可以根据程序的需要创建和销毁对象。

相反,值类型的对象通常是在编译时确定并分配内存的。

3.对象的生存期不受限制:与值类型不同,引用类型的对象生存期不受限制。

当一个引用类型的对象没有任何引用指向它时,它就成为垃圾,会被垃圾回收器自动回收,释放内存。

4.对象的共享和传递:由于引用类型存储的是对象的地址,多个引用类型的变量可以指向同一个对象。

这使得对象的共享成为可能,多个变量可以同时访问和修改同一个对象。

此外,通过传递引用类型的变量作为参数,可以实现对对象的引用传递,对对象的修改可以在函数调用之后保持有效。

引用类型的用途引用类型在编程中有多种用途,下面是一些常见的应用场景:1.对象的封装和抽象:引用类型可以用来封装复杂的对象和数据结构,并提供一种抽象的方式来操纵这些数据。

例如,在面向对象编程中,引用类型通常用来定义类的实例,通过方法和属性来操纵和访问对象的内部状态。

2.数据结构的实现:引用类型可以用来实现各种数据结构,如链表、树、图等。

这些数据结构通常需要动态分配内存,并且可以通过引用类型的指针和链接来组织和访问数据。

3.函数和方法的参数和返回值:引用类型可以作为函数和方法的参数和返回值,实现对对象的引用传递和返回。

这样可以避免在函数中复制大量的数据,提高程序的效率。

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

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

C#中值类型和引用类型的区别1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。

2. 值类型存取速度快,引用类型存取速度慢。

3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用4. 值类型继承自System.ValueType,引用类型继承自System.Object5. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放6. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

7.值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。

注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。

由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。

在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

C#中值类型和引用类型解析、本质区别有哪些?在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

常见的值类型数据有:整值型(整形,浮点型,十进制型),布尔类型,枚举类型;引用类型有:接口,数组,Object类型,类,委托,字符串,null类型。

在C#中每种类型的存储方式有两种:1)分配在托管栈中;2)分配在托管堆中;内存的分配有CLR管理(即公共语言运行时),这两种方法的区别是:1)分配在托管栈中的变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量UserInput=C,当实例化它的方法结束时,UserInput变量在栈上占用的内存就会自动释放;2)分配在托管堆中的变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放。

C#中的基元类型、值类型和引用类型

C#中的基元类型、值类型和引用类型

C#中的基元类型、值类型和引⽤类型1. 基元类型(Primitive Type) 编译器直接⽀持的类型称为基元类型。

基元类型可以直接映射到 FCL 中存在的类型。

例如,int a = 10中的 int 就是基元类型,其对应着FCL 中的 System.Int32,上⾯的代码你完全可以写作System.Int32 a = 10,编译器将⽣成完全形同的 IL,也可以理解为 C# 编译器为源代码⽂件中添加了using int = System.Int32。

1.1 基元类型的算术运算的溢出检测 对基元类型的多数算术运算都可能发⽣溢出,例如byte a = 200;byte b = (Byte)(a + 100);//b 现在为 4 上⾯代码⽣成的 IL 如下 从中我们可以看出,在计算之前两个运算数都被扩展称为了32位,然后加在⼀起是⼀个32位的值(⼗进制300),该值在存到b之前⼜被转换为了Byte。

C# 中的溢出检查默认是关闭的,所以上⾯的运算并不会抛出异常或产⽣错误,也就是说编译器⽣成 IL 时,默认选择加、减、乘以及转换操作的⽆溢出检查版本(如上图中的 add 命令以及conv.u1都是没有进⾏溢出检查的命令,其对应的溢出检查版本分别为add.ovf和conv.ovf),这样可以使得代码快速的运⾏,但前提是开发⼈员必须保证不发⽣溢出,或者代码能够预见溢出。

C#中控制溢出,可以通过两种⽅式来实现,⼀种全局设置,⼀种是局部控制。

全局设置可以通过编译器的 /checked 开关来设置,局部检查可以使⽤ checked/unchecked 运算符来对某⼀代码块来进⾏设置。

进⾏溢出检查后如果发⽣溢出,会抛出System.OverflowException 异常。

通过上述设置后编译器编译代码时会使⽤加、减、乘和转换指令的溢出检查版本。

这样⽣成的代码在执⾏时要稍慢⼀些,因为 CLR 要检查这些运算是否发⽣溢出。

类与结构体的区别

类与结构体的区别

区别有三:1: 类可以继承,结构不可以.2: 类是引用类型,结构是值类型3: 类在堆中,结构在栈分配内存二 .类与结构的差别1.值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。

所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用2.继承性结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样例如:结构实现接口interface IImage{void Paint();}struct Picture : IImage{public void Paint(){// painting code goes here}private int x, y, z; // other struct members}3.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有abstract和sealed(因为不能继承)不能有protected修饰符可以不使用new初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用abstract和sealed有protected修饰符必须使用new初始化三.如何选择结构还是类讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

值类型和引用类型的区别[转]
似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%,哈哈,我该买彩票去!
言归正传,咱还是先来探讨探讨这二者之间有什么区别吧。

记得有一次电话面试中,我直接跟面试官说:“值类型是现金,引用类型是存折”,后来想想当时说这话虽是有点儿冲动地脱口而出,但也没什么不妥。

我这人不善于背理论的教条,喜欢把书本上那些生硬的话跟现实生活中常见的事物联系起来理解和记忆。

直白点儿说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。

声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。

引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。

具体哪些类型是值类型哪些是引用类型,大家翻翻书,背一背就好了,不过我想,做过一段时间的开发,即使您背不了书上教条的定义,也不会把值类型和引用类型搞混的。

接下来,还是老规矩,咱看码说话吧。

1:public class Person
2: {
3:public string Name { get; set; }
4:public int Age { get; set; }
5: }
6:
7:public static class ReferenceAndValue
8: {
9:public static void Demonstration()
10: {
11: Person zerocool = new Person { Name = "ZeroCool", Age = 25 };
12: Person anders = new Person { Name = "Anders", Age = 47 };
13:
14:int age = zerocool.Age;
15: zerocool.Age = 22;
16:
17: Person guru = anders;
18: = "Anders Hejlsberg";
19:
20: Console.WriteLine("zerocool's age:\t{0}", zerocool.Age);
21: Console.WriteLine("age's value:\t{0}", age);
22: Console.WriteLine("anders' name:\t{0}", );
23: Console.WriteLine("guru' name:\t{0}", );
24: }
25: }
上面这段代码,我们首先创建了一个Person类,包含了Name和Age两个属性,毋庸置疑,Person 类是引用类型,Name也是,因为它是string类型的(但string是很特殊的引用类型,后面将专门有一篇文章来讨论),但Age则是值类型。

接下来我们来看看Demonstration方法,其中演示的就是值类型跟引用类型的区别。

首先,我们声明了两个Person类的实例对象,zerocool和anders,前面提到过,这两个对象都被分配在堆上,而zerocool和anders本身其实只是对象所在内存区域的起始地址引用,换句话说就是指向这里的指针。

我们声明对象实例时也顺便分别进行了初始化,首先我们看,zerocool 对象的值类型成员,我们赋值为25(对,我今年25岁),anders(待会儿你们就知道是谁了)的Name属性,我们赋值为“Anders”。

齐活儿,接下来看我们怎么干吧。

我们声明一个值类型变量age,直接在初始化时把zerocool的Age值赋给它,显然,age的值就是25了。

但这个时候zerocool不高兴了,他想装嫩,私自把自己的年龄改成22岁,刚够法定结婚年龄。

然后我们又声明了一个引用类型的guy对象,初始化时就把anders赋给它,然后anders露出庐山真面目了,他的名字叫“Anders Hejlsberg”(在此向C#之父致敬)。

接下来我们来分别答应出这几个变量的值,看看有什么差别。

你可能要觉得奇怪(你要不觉得奇怪,也就不用再接着往下看了),为什么我们改了zerocool.Age 的值,age没跟着变,改了的值,却跟着变了呢?这就是值类型和引
用类型的区别。

我们声明age值类型变量,并将zerocool.Age赋给它,编译器在栈上分配了一块空间,然后把zerocool.Age的值填进去,仅此而已,二者并无任何牵连,就像复印机一样,只是把zerocool.Age的值拷贝给age了。

而引用类型不一样,我们在声明guy的时候把anders 赋给它,前面说过,引用类型包含的是只想堆上数据区域地址的引用,其实就是把anders的引用也赋给guy了,因此这二者从此指向了同一块内存区域,既然是指向同一块区域,那么甭管谁动了里面的“奶酪”,另一个变现出来的结果也会跟着变,就像信用卡跟亲情卡一样,用亲情卡取了钱,与之关联的信用卡账上也会跟着发生变化。

一提到钱,估计大家伙儿印象就深了些吧,呵呵!
另外,性能上也会有区别的。

既然一个是直接操作内存,另一个则多一步先解析引用地址,那么显然很多时候值类型会减小系统性能开销。

但“很多时候”不代表“所有时候”,有些时候还得量力而为,例如需要大量进行函数参数传递或返回的时候,老是这样进行字段拷贝,其实反而会降低应用程序性能。

另外,如果实例会被频繁地用于Hashtable或者ArrayList之类的集合中,这些类会对其中的值类型变量进行装箱操作,这也会导致额外的内存分配和内存拷贝操作,从应用程序性能方面来看,其实也不划算。

哦对了,上面提到了一个概念,装箱。

那么什么是装箱呢?其实装箱就是值类型到引用类型的转化过程。

将一个值类型变量装箱成一个引用类型变量,首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。

装箱操作是可逆的,所以还有拆箱操作。

拆箱操作获取只想对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。

接下来我们来看看典型的装箱和拆箱操作。

1:public static class BoxingAndUnboxing
2: {
3:public static void Demonstration()
4: {
5:int ageInt = new int();
6:
7:// Boxing operation.
8:object ageObject = ageInt;
9:
10://ageObject = null;
11:
12:// Unboxing operation.
13: ageInt = (int)ageObject;
14:
15: Console.WriteLine(ageInt);
16: }
17: }
在该方法中,我们首先声明了一个值类型变量ageInt,但并未给它赋值,接着声明了一个典型的引用类型变量ageObject,并把ageInt赋给它,这里就进行了一次装箱操作。

编译器现在托管堆上分配一块内存空间(空间大小为对象中包含的值类型变量所占空间总和外加一个方法表指针和一个SyncBlockIndex),然后把ageInt拷贝到这个空间中,再返回该空间的引用地址。

接下来第13行则是拆箱操作,编译器获取到ageObject对象中值类型变量的指针,然后将其值拷贝给值类型变量。

如果你把第10行注释掉的代码打开(这是通俗说法,其实就是取消注释),那么第13行就会抛出System.NullReferenceException异常,要说问什么,这又会牵扯出值类型跟引用类型另一个大的不同。

看见了吧,声明ageInt时并没有赋值,如果关掉第10行代码,程序不会报错,最后打印出个0,这说明在声明值类型变量时,如果没有初始化赋值,编译器会自动将其赋值为0,既然值类型没有引用,那么它就不可能为空。

引用类型不一样,它可以为空引用,一张过期作废的银行卡是可以存在。

而如果将一个空的对象拆箱,编译器上哪儿去找它里面的值类型变量的指针呢?所以这也是拆箱操作需要注意的地方。

最后,我们在把值类型和引用类型之间其它一些明显区别大致罗列如下,以便大家能顺利通过面试第一问。

之外其它任何方法,不过它倒是改写了Equals和GetHashCode两个方法。

引用类型变量的Equals比较的是二者的引用地址而不是内部的值,值类型变量的Equals方法比较的是二者的值而不是……哦对了,值类型压根儿没有引用地址;
•值类型不能作为其它任何类型的基类型,因此不能向值类型中增加任何新的虚方法,更不该有任何抽象方法,所有的方法都是sealed的(不可重写);
•未装箱的值类型分配在栈上而不是堆上,而栈又不是GC的地盘儿,因此GC根本不过问值类型变量的死活,一旦值类型变量的作用范围一过,它所占的内存空间就立即被回收掉,不劳GC亲自动手。

以上罗列的都是值类型和引用类型之间的主要区别,文码并茂,相信应该给你留下比较深刻的印象,虽不够深,但愿能起到抛砖引玉的作用。

如果去面SDE职位,估计这深度就差不多了,我这文章不是面向那些要去面Senior SDE甚至Dev Lead的正神,咱这儿庙小,嘿嘿!。

相关文档
最新文档