引用类型

C#语法--委托,架构的血液

别来无恙 提交于 2019-12-09 13:43:08
委托的定义 什么是委托? 委托实际上是一种类型,是一种引用类型。 微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样。都是声明用的。 下面先看下声明代码,这里声明了两个委托。 1 2 public delegate void TestDelegate(string message); public delegate int TestDelegate(MyType m, long num); delegate既然是关键字,和int,string一样,那么,为什么delegate后又跟了一个void或者int呢? 如果他们是同等地位的关键字,为什么可以一起使用呢? 很简单,我们把delegate后面的 【void TestDelegate(string message)】理解为一个变量,是不是就清晰明了了一些。 我们把delegate关键字理解为,是用来专门来定义这种复杂的变量的。而这种复杂的变量可以包含一个返回值和任意数目任意类型的传入参数。 有没有感觉,这个复杂的变量特别像一个函数的定义。 没错,官方定义,委托类型的声明与方法签名相似。所以,这个复杂变量,的确,书写的方式就是与函数一样。 那么,为什么这个声明方式如此怪异呢,是因为,我们用delegate定义的变量,只能用函数赋值。赋值方式如下所示: 1 2 3 4 5 6 7

js内存空间

[亡魂溺海] 提交于 2019-12-08 21:51:28
堆数据结构 堆数据结构是一种树状结构。它的存取数据的方式与书架和书非常相似。我们只需要知道书的名字就可以直接取出书了,并不需要把上面的书取出来。JSON格式的数据中,我们存储的 key-value 可以是无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。 队列 队列是一种先进先出( FIFO )的数据结构,这是事件循环(Event Loop)的基础结构。 变量的存放 首先我们应该知道内存中有栈和堆,那么变量应该存放在哪里呢, 堆 ? 栈 ? 1、基本类型 --> 保存在 栈 内存中,因为这些类型在内存中分别占有固定大小的空间,通过按值来访问。基本类型一共有6种:Undefined、Null、Boolean、Number 、String和Symbol 2、引用类型 --> 保存在 堆 内存中,因为这种值的大小不固定,因此不能把它们保存到栈内存中,但内存地址大小的固定的,因此保存在堆内存中,在栈内存中存放的只是该对象的访问地址。当查询引用类型的变量时, 先从 栈中读取内存地址 , 然后再通过地址 找到堆中的值 。对于这种,我们把它叫做按引用访问。 在计算机的数据结构中,栈比堆的运算速度快,Object是一个复杂的结构且可以扩展:数组可扩充,对象可添加属性,都可以增删改查。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作

js中引用类型Math一些常用的方法和属性

随声附和 提交于 2019-12-08 21:33:28
js中有一种引用类型叫做Math,和Global属于单体内置对象,里面有一些非常常用的数学方法和数学常量 常用数学常量 Math.E; // 自然对数的底数Math.LN10 10的自然对数 Math.LN2; // 2的自然对数 Math.LOG2E; // 以2为底e的对数 Math.LOG10E; // 以10为底e的对Math.PI π的值 Math.SQRT1_2; // 1/2的平方根(即Math.SQRT2 2的平方根 Math中一些常用的方法 max();// 求最大值 参数任意 min();// 求最小值 参数任意 floor();// 地板(向下)取整 ceil();// 天花板(向上)取整 round();// 四舍五入取整 random();// [0,1) 大于等于0,小于1之间的随机浮点数 // 公式 : 随机返回某个整数范围内的一个整数 // 随机值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) // 例子: 从 2 数到 10 要数 9 个数,因此可能值的总数就是 9,而第一个可能的值就是 2。 // 例子: 总共有 10 个可能的值(1 到 10),而第一个可能的值是 1。 // 函数 : 随机返回某个整数范围内的一个整数 function selectFrom(lowerValue,

.NET面试题系列(二十一)C#中Equals和==的比较

故事扮演 提交于 2019-12-08 21:18:35
序言 值类型的比较 int i = 9; int j = 9; Console.WriteLine("Equals和= =(等于号)的比较"); Console.WriteLine("i.Equals(j) :" + i.Equals(j)); Console.WriteLine("i==j " + (i == j)); 结论:对于值类型来说 两者是相同的 都是比较的变量的值 引用类型的比较 对于引用类型来说,等号(==)比较的是两个变量的”引用” 是否一样,即是引用的”地址”是否相同。而对于equals来说仍然比较的是变量的 ”内容” 是否一样 大家可能会问 上面说的 = =号是比较两个引用类型的变量的引用是否一致,但是上面的s1 和s2是两个不同的变量,为何比较的输出是true呢? 答案 : 由于string是微软封装的一个字符串类,在内部他已经对 = = 操作符进行了重写。 重写后他比较的则是两个变量的内容是否相同 ,下面我会给大家证明的: 总结 Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同) 资料 来源: https://www.cnblogs.com/cnki/p/12007233.html

javascript 面向对象编程 (1)

我与影子孤独终老i 提交于 2019-12-08 18:50:33
1.理解global对象 global对象是作为 window 对象的一部分实现的,我们无法通过代码访问到 global 对象。 我们平时在全局环境下定义的内容(变量,函数,常量等等)都是作为 global 对象的属性存在的(都属于 global 对象) 2.基本类型(原始类型)数据的存储方式 变量在存储原始类型的数据时, 直接将数据存储到变量的内存空间中 , 当我们将存储数据的变量赋值给另一个变量时,其实是将变量存储的 数据复制 了一份保存到另一个变量的内存空间中, 因为每个变量都是使用自己独立的存储空间保存原始类型的数据,因此我们改变其中一个变量空间中的数据时,不会影响到另一个变量 1 <body> 2 <script> 3 4 /* 5 变量在存储原始类型的数据时,直接将数据存储到变量的内容空间中。 6 */ 7 8 var color1 = 'red'; 9 10 /* 11 当我们将存储原始数据的变量赋值给另一个变量时,其实是将变量存储的数据复制了一份保存到了另一个变量的内存空间中。 12 */ 13 var color2 = color1; 14 15 /* 16 因为每个变量都是使用自己独立的存储空间保存原始类型的数据,因此我们改变其中一个变量空间中的数据时,不会影响到另一个变量。 17 */ 18 color1 = 'green'; 19 20 console

浅克隆与深克隆

落花浮王杯 提交于 2019-12-07 22:56:35
一、浅克隆与深克隆 浅克隆克隆对象本身,包括基本数据类型变量和持有的非基本数据类型的引用类型变量,但不克隆非基本数据类型的引用类型变量所指向的对象 深克隆克隆对象本身,包括基本数据类型变量和持有的非基本数据类型的引用类型变量,以及克隆非基本数据类型的引用类型变量所指向的对象 如下图示:(有空再画) 二、代码 Person类持有Job类的引用,Job类持有Salary类的引用。Client类做测试。 1、浅克隆 Person.java package com.test.clone; import java.util.Date; public class Person implements Cloneable{ private String name; private Job job; private Date date; public Person(String name, Job job) { super(); this.name = name; this.job = job; } public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public

深克隆和浅克隆的区别

﹥>﹥吖頭↗ 提交于 2019-12-07 22:55:12
深克隆和浅克隆的区别 js变量包含两种不同数据类型的值:基本类型和引用类型 基本类型都是按值访问的,我们可以直接操作保存在变量中实际的值 引用类型(array、object)访问的是保存字变量对象中的一个地址,因此出现了深克隆和浅克隆 深克隆和浅克隆的区别 浅克隆(shallow copy):新旧对象共享一个地址,改变一个,另一个也会改变 深克隆(deep copy):新旧对象不共享一个地址 基本类型: var a = 25 ; var b = a; b = 10 ; console.log(a); //25 console.log(b); //10 引用类型: //浅克隆 var tag = [ 1 , 2 , 3 , 4 ]; var arr = tag; arr.push( 5 ); console.log(tag); //12345 console.log(arr); //12345 当操作新对象,但又不希望影响旧对象时,比如数组的一些方法会改变数组本身,就需要用到深克隆 我总结了几种常见的方法: 方法1:… var a = [ 1 , 2 , 3 ]; var b = [...a] b.reverse(); console.log(a); //123 console.log(b); //321 方法2:slice(0) var a = [ 1 , 2 , 3 ]; var

引用类型用法总结

依然范特西╮ 提交于 2019-12-06 22:39:28
引用类型用法总结 实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。 class作为成员变量 类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。 定义自定义类 package demo04; public class Car { private String name; private String color; public Car(String name, String color) { this.name = name; this.color = color; } public Car() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } } 使用自定义类作为类的成员变量 package demo04; public class Student {

C#基础提升系列——C# 泛型

一曲冷凌霜 提交于 2019-12-06 13:49:51
C# 泛型(Generics) 泛型概述 泛型是C#编程语言的一部分,它与程序集中的 IL ( Intermediate Language ,中间语言)代码紧密的集成。通过泛型,我们不必给不同的类型编写功能相同的许多方法和类,而是可以创建独立于被包含类型的一个类或方法。 例如,通过使用泛型类型参数 T,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险。使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。 泛型性能 泛型的一个主要优点是性能。值类型存储在栈上,引用类型存储在堆上。从值类型转换为引用类型称为装箱;从引用类型转换为值类型称为拆箱。对值类型使用非泛型集合类,常常需要将值类型和引用类型互相转换,进行装箱和拆箱操作,性能损失比较大。而使用了泛型,可以很好的解决这一问题,泛型可以不再进行装箱和拆箱操作。 泛型类型安全 泛型的另一个特性是类型安全。例如,在泛型类 List<T> 中,泛型类型 T 定义了允许使用的类型。假设有一个泛型实例为 List<int> ,它在添加元素时,就只会添加类型为 int 的数值到集合中。 泛型允许二进制代码重用 泛型允许更好的重用二进制代码,泛型类可以定义一次,使用许多不同的类型实例化。例如,泛型类 List<T> 可以实例化为 List<int> 、 List<string> 、 List

《浏览器工作原理与实践》 <12>栈空间和堆空间:数据是如何存储的?

帅比萌擦擦* 提交于 2019-12-06 12:36:37
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视。特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaScript 的内存机制是什么。 但是如果你想成为行业专家,并打造高性能前端应用,那么你就必须要 搞清楚 JavaScript 的内存机制 了。 其实,要搞清楚 JavaScript 的内存机制并不是一件很困难的事,在接下来的三篇文章(数据在内存中的存放、JavaScript 处理垃圾回收以及 V8 执行代码)中,我们将通过内存机制的介绍,循序渐进带你走进 JavaScript 内存的世界。 今天我们讲述第一部分的内容—— JavaScript 中的数据是如何存储在内存中的 。虽然 JavaScript 并不需要直接去管理内存,但是在实际项目中为了能避开一些不必要的坑,你还是需要了解数据在内存中的存储方式的。 让人疑惑的代码 首先,我们先看下面这两段代码: function foo(){ var a = 1 var b = a a = 2 console.log(a) console.log(b) } foo() function foo(){ var a = {name:"极客时间"} var b = a a.name = "极客邦" console.log(a) console.log