引用类型

Javascript 浅拷贝与深拷贝

守給你的承諾、 提交于 2020-01-31 05:52:58
在了解JS的浅拷贝与深拷贝之前,我们需要先知道什么是值传递与引用传递。 在JS中,基本类型值的拷贝是按值传递的,而引用类型值的拷贝则是按引用传递的。通过值传递的变量间不会有任何牵连,互相独立;但是引用传递拷贝的变量间则会相互影响,修改其中任何一方所引用的对象的值都会在另一方中体现,之所以会有这样的表现和JS的内存机制有关。 JS的内存也分为堆和栈,但是注意这里的堆栈和数据结构的堆栈是不同的概念。 栈:由系统自动分配,自动回收,效率高,但容量小 堆:由程序员手动分配内存,并且手动销毁(高级语言如JS中有垃圾自动回收机制),效率不如栈,但容量大 JS定义的基本类型值会被存放在栈内存中,JS可以直接访问栈内存,所以访问存放基本类型值的变量可以直接访问到基本类型值。而引用类型因为其大小不固定,系统会为引用类型分配堆内存存放,而只将指向该堆内存空间的指针(引用)存放在栈中,JS不予许直接访问存放引用类型值的堆内存,只能通过访问引用间接的访问引用类型值。这样一来,我们访问引用类型值时,实质上只是在访问它的引用,然后再按照这个引用地址去堆中找到它的实际内容。 因此进行拷贝的时候,对于基本类型值变量,系统会为新变量单独开辟一个新的栈内存空间,并将源变量保存的基本类型值拷贝一份保存到里面。而对于引用类型值,新变量拷贝得到的只是引用对象的引用而已,这么一来

C#测试题(一)

允我心安 提交于 2020-01-30 22:09:00
C#测试题(一) 1.简答介绍对象的构成,并做出说明 对象的构成:属性,方法,事件, 属性:一个对象与生俱来的,方法:一个对象的主动行为, 事件:一个对象的被动行为 2.C#中15中属性类型分别是哪些 // 值类型 整数8种:byte,sbyte,short,ushort,int,uint,long,ulong, 小数三种:float,double,decimal, // 引用类型 字符串:string,字符型:char,对象类型:object 3、C#属性赋值的四个步骤 ①.看类型,是15种直接赋值 ②.不是15种的等号后空格如果出智能提示,选择需要的分号结束 ③.空格空不出来,new空格选择需要的分号结束,删掉前半个小括号再加上看重载,根据智能提示继续按照上面步骤继续赋值 ④特殊的属性类型,如this.Backcolor=Color.Red; 4.C#在编辑代码中如何区别对象的三个组成部分 扳手为属性,方块为方法,闪电为事件 5.在编辑C#代码中遇到对象的三个组成部分时应该如何处理? 属性(扳手)根据属性赋值的四个步骤进行,方法(方块)删掉前半个小括号然后加上看重载,根据提示进行赋值,事件(闪电)+=两次TAB 6.C#中方法赋值的基本过程详细说明 方法(方块)删掉前半个小括号然后加上看重载,根据提示继续按照属性赋值四个步骤进行赋值, 7.简单介绍装箱和拆箱 装箱

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

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

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

主宰稳场 提交于 2020-01-30 10:07:54
简介 前几年的时候只是在上学的时候知道值类型是存在栈中,引用类型存在堆中,但是到底为什么这么存储以及这么存储的好处是什么不太理解,正好今年开始记录博客,以及看了一些书上的内容记录一下。 值类型 类型 默认值 说明 byte 0 8位无符号的整数(0~255) sbyte 0 8位有符号的整数(-128~127) long 0 64位有符号整数(-2 ulong 0 64位无符号整数 short 0 16位有符号整数 ushort 0 16位无符号整数 int 0 32位有符号整数 uint 0 32位无符号整数 float 0.0 表示一个单精度浮点数字 double 0.0 表示一个双精度浮点数 decimal null 28位精度 char '\0' 16位字符 bool false true或者false struct null 结构体 enum null 枚举类型 1.值类型隐式的继承了(System.ValueType),值类型一般是存放在栈当中,实例化一个值类型的时候在栈中开辟一个空间的时候已经包含了本身的字段,所以性能来说要比引用类型快(引用类型在存放的是指向对象数据的内存地址),并且值类型由于不存放在堆当中,不被gc的管控,因此值类型的使用缓解了托管堆的压力,并且减少了应用程序生存期内的垃圾回收次数。 当如下创建一个值类型的时候

深入理解C# 第三版学习笔记

不羁的心 提交于 2020-01-29 22:52:44
第一章 P1 本书的关键主题之一就是进化(或者说演变)。在将任何特性引入语言之前,设计团队都会把这个特性放到现有的环境中,同时还会就其总体发展目标,对其进行严格的考察。 P4 (在P3展示了C#1.0中产品类及列表的定义方法后) C# 1的代码存在如下3个局限: ArrayList没有提供与其内部内容有关的编译时信息。完全有可能不慎在Product类型的ArrayList列表中添加一个字符串类型的对象后,编译器还当做无事发生过 代码中为属性提供了公共的取值方法,这意味着如果添加对应的赋值方法,那么赋值方法也必须是公共的。 用于创建属性和变量的代码过于复杂 P5-7 (展示了C#2、3版本中对上述三个问题的解决方法) 使用支持泛型的List取代类型不安全的ArrayList。后者考虑到兼容性依然保留,但不再推荐使用 public属性可以有private的赋值方法 支持自动实现与简化对象的属性 P8 排序和过滤的代码示范 在C#1的代码中,通过实现ArrayList的IComparer接口对列表进行排序。期间必须实现两次强制类型转换,将两个在ArrayList中以Object类型存储的,待比较的对象转化为Product,然后再比较。不仅涉及到性能问题,也有类型不安全的隐忧 P9 使用泛型与匿名函数优化后的代码 使用泛型使我们跳过了强制类型转换,而匿名函数则精简了接口的实现过程

ES6基础之let、const

末鹿安然 提交于 2020-01-29 18:15:40
es6的块级作用域通俗的讲就是一对花括号中的区域( 声明对象的花括号不是块级作用域 ),块级作用域可以嵌套。 let : 1、le声明的变量只在当前(块级)作用域内有效。 2、let声明的变量不能被重复声明。否则同一作用域下会报错,不同块级作用域可以定义同名变量。 3、let不存在变量提升。先打印再声明会报错。 关于暂存死区(了解即可): 1、用var时会从上到下按顺序打印。 2、一般会往上级作用域去找,但用 let 时在es6中向上找到了同一个变量也是拿不到的。因为es6规定如果块级作用域中存在let、const声明的变量,这个变量一开始就会形成一个封闭的作用域。 var monkey = 'houzi'; { console.log(monkey); //houzi var monkey = 'little'; } console.log(monkey); //little let m = 'houzi'; { console.log(m); //报错m is not defined let m = 'little'; } console.log(m); const : 1、声明常量:const c = '我是常量' 2、常量必须在声明的时候被初始化(即赋值) 3、常量不能重复声明、不存在提升、只能在当前(块级)作用域内有效 4、一旦声明常量,就不能改变(引用类型需要冻结)

JVM指令手册

℡╲_俬逩灬. 提交于 2020-01-29 05:15:46
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引) 从栈中的局部变量中装载值的指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值(refernce)

.NET基础面试题整理

泪湿孤枕 提交于 2020-01-29 04:25:45
1.什么是.NET?什么是CLI?什么是CLR?IL是什么? (1).net用于代码编译和执行的集成托管环境,换句话,它管理应用程序运行的方方面面,包括首次运行的编译,为程序分配内存 存储数据和指令,对于应用程序授予或拒绝相应的权限,并启动管理应用程序的执行,剩余内存的在分配。由于所有.net应用程序 都是在.net framework上面执行,所以开发人员只需考虑与.net framework打交道,而不必关系和底层操作系统上面的实现 包括CLR和BCL (2).CLI(common language infrastructure)公共语言基础结构,一项国际性的标准,没有规定标准具体如何实现。相反,它描述了一个 CLI平台在符合标准的前提下应该具有什么行为。包含了:运行时(CLR),公共中间语言(CIL),公共类型系统(CTS), 公共语言规范(CLS),元数据(Metadata),框架(framework) (3)CLR:公共语言运行时,负责加载和运行程序 IL:中间语言,C#编译器将C#代码转换成IL,运行时能够理解IL,并编译成机器码 2.JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式? JIT:Just in time,C#或者是VB.NET的代码首先被编译为IL存储在本地,当要运行这些代码的时候,CLR对IL进行第二次编译转换成机器码运行。好处

[翻译] C# 8.0 预览

做~自己de王妃 提交于 2020-01-29 01:46:27
原文: C# 8.0 Previewed 在一个Channel 9 的 视频 中,Mads Torgersen展示了C#8的首批四个新特性。 可空引用类型 过去我们报道过 可空引用类型 ,简单地说,默认情况下引用类型将不再能为空。相应的,您必须使用与可空值类型相同的 Type? 语法将其明确标记为可空。 将 null 分配给不可为空的引用类型将得到一个编译器警告。 同样,从可空类型读取也将得到一个编译器警告,除非提前对有问题的变量进行显式检查。 所以理论上开发者需要做的唯一改变是适当情况下加上问号。 自从我们的报告,这个特性添加了一个新的语法。 考虑一种情况,你明知道可空变量x实际上不是空值,但却无法编译器证明。 在这种情况下,可以使用 x!.Method() 来禁止编译器对潜在空引用异常的警告。 异步流 (即 foreach async) 异步流类似于 IEnumerable 的异步方式。 正如我们之前报道的,异步流是自2015年以来一直在努力推进的事。经过多次讨论,最终确定的语法是: foreach await (string s in asyncStream) 使用下面的方法签名来定义一个异步迭代器 async IAsyncEnumerable<T> MethodName() 与普通的 IEnumberable 方法一样,你可以使用 yield return