引用类型

《C# 6.0 本质论》 - 学习笔记

别等时光非礼了梦想. 提交于 2020-02-26 03:21:31
**《C# 6.0 本质论》 ========== ========== ========== [作者] (美) Mark Michaelis (美) Eric Lippert [译者] (中) 周靖 庞燕 [出版] 人民邮电出版社 [版次] 2017年02月 第5版 [印次] 2017年02月 第1次 印刷 [定价] 108.00元 ========== ========== ========== 【前言】 成功学习 C# 的关键在于,要尽可能快地开始编程。不要等自己成为一名理论方面的 “专家” 之后,才开始写代码。 学习一门计算机语言最好的方法就是在动手中学习,而不是等熟知了它的所有 “理论” 之后再动手。 为了从简单程序过渡到企业级开发, C# 开发者必须熟练地从对象及其关系的角度来思考问题。 一名知道语法的程序员和一名能因时宜地写出最高效代码的专家的区别,关键就是这些编码规范。专家不仅让代码通过编译,还遵循最佳实践,降低产生 bug 的概率,并使代码的维护变得更容易。编码规范强调了一些关键原则,开发时务必注意。 总地说来,软件工程的宗旨就是对复杂性进行管理。 【第01章】 (P001) 学习新语言最好的办法就是动手写代码。 (P003) 一次成功的 C# 编译生成的肯定是程序集,无论它是程序还是库。 在 Java 中,文件名必须和类名一致。 从 C# 2.0 开始

Java学习入门 -03-基本类型与引用类型

爱⌒轻易说出口 提交于 2020-02-25 22:54:56
1、基本类型 Java的8种基本类型:byte(1字节=8bit,默认值0)、short(2字节,默认值0)、int(4字节,默认值0)、long(8字节,默认值0L)、float(4字节,默认值0.0f)、double(8字节,默认值0.0d)、char(2字节,默认值\u0000)、boolean(1字节,默认值false) 基本类型,实际内容保存在堆内存中,注意默认值,跟这种类型数组、类实例变量默认值对应。 2、引用类型(缺省值null) 对象、数组都是引用数据类型,引用类型定义会在内存中分配两个地址空间,用栈来保存内容内存地址、内容大小等,内容保存在堆内存中。 注意: (1)内容地址大小跟系统位数有关,如:系统是32位,那么内容地址大小就是32位。 (2)为什么需要两个地址来存放引用类型定义等变量,因为实际内容存储空间比基本类型变量空间大很多,所以定义为动态的存储空间是适合的,所以需要两个地址空间来存放。 (3)对象的引用是指存储所在堆中某个区域的指针,所有的对象数据类型都属于引用数据类型。 (4)对于类的对象。引用指向所属类型的对象,并且通过引用来操作对象。 (5)类表示自定义数据类型。类是具象世界抽象为数据的媒介,这个媒介工具作为数据、动作集合的容器。 (6)数组是特殊的类。 定义数组的几种方式及常用写法: int[] arr0 = new int[]{1,2,3,4,

C#装箱和拆箱

北城以北 提交于 2020-02-25 22:26:45
简单的说 装箱:值类型转成引用类型 拆箱:引用类型转成值类型 这里就执行了装箱和拆箱操作。 Box 和 Unbox 的解释参考官网: Box官网注释 Unbox 官网注释 说说装箱 的步骤: 0、将值入栈,(注意,不管这个值是在堆,还是在栈,还是在哪里,都需要先将值入栈) 1、在托管堆中分配内存。分配的内存量是值类型各字段所需的内存量,还要加上类型对象指针和同步块索引所需的内存量 2、 把入栈的值,弹出栈,复制到新分配的堆里 3、返回对象地址,把地址入栈 注:两个开销字段—— 类型对象指针和同步块索引,所需的内存在32位应用程序上需要4+4=8个字节,64位上是16字节 看看例子: object obj = 3;装箱步骤 0、 它是先将值 3 入栈 1、在托管堆中分配内存,在32位应用上是 4(int所需的内存) + 8 = 12个字节 2、把3弹出栈,并复制到新分配的内存堆里 3、把新地址入栈 在申请堆空间的时候,有可能会触发 GC 。 注意, obj 那个 3 和入栈那个 3 不是一个东西了。看如下代码的输出: 修改了 i ,但是 obj 的值依然是 3. 下面看个例子: int i = 3; object obj = i; Console.WriteLine(i + ", obj: " + (int)obj); 这个代码会进行三次装箱,因为字符串的 + 用的是 String:

理解浅拷贝和深拷贝

拜拜、爱过 提交于 2020-02-25 15:59:38
1、浅拷贝与深拷贝的定义    什么是拷贝?拷贝即为常说的复制或者克隆一个对象,并且通过拷贝这些源对象创建新的对象。其中拷贝分为浅拷贝和深拷贝。对于拷贝出来的对象,在使用上有很大的差异,特别是在引用类型上。   浅拷贝:将对象中的所有字段复制到新的对象中。其中, 值类型 字段被复制到新对象中后,在新对象中的修改不会影响到原先对象的值。而新对象的 引用类型 则是原先对象引用类型的引用,不是引用自己对象本身。 注 :在新对象中修改引用类型的值会影响到原先对象; 理论上String也是引用类型,但是由于由于该类型比较特殊,Object.MemberwiseClone()方法依旧为其新对象开辟了新的内存空间存储String的值,在浅拷贝中把String类型当作'值类型'即可。   深拷贝:同样也是拷贝,但是与浅拷贝不同的是,深拷贝会对 引用类型 重新在创新一次(包括 值类型 ),在新对象做的任何修改都不会影响到源对象本身。    2、实现浅拷贝与深拷贝   在 .Net平台开发中,要实现拷贝,微软官方建议继承ICloneable接口,该接口位于 System 命名空间下,该接口只实现一个Clone方法,我们可以根据具体项目需求在该方法内实现浅拷贝或者深拷贝。先实现一个浅拷贝,具体代码如下: //Equal探索 static void Main() { //创建源对象 Teacher

java装箱和拆箱

筅森魡賤 提交于 2020-02-25 14:11:46
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类: boolean Boolean char Character byte Byte short Short intInte ger long Long float Float double Double 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 public class AutZhun { /** * 测试自动装箱,自动拆箱 * * @author clc * @param args */ public static void main(String[] args) { test(); } static void test() { Integer a = new Integer(1234); Integer a1 = 890;// jdk5.0之后 . 自动装箱,编译器帮我们改进代码:Integer a1 = new //

java基本类型和包装类的区别

此生再无相见时 提交于 2020-02-25 14:08:43
int 是基本类型,直接存数值 Integer是类,产生对象时用一个引用指向这个对象 Java把内存划分成两种:一种是栈内存,另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 而实际的对象是在存储堆内存中 即 int i = 5;//直接在栈中分配空间 Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中 在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理. 因为在堆中分配空间所需的时间远大于从栈中分配存储空间,所以JAVA速度比C 慢 当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的外覆类了。Java中每种基本类型都有相应的外覆类。 int 和 Integer 的区别 java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float

JavaScript:Number 对象

只谈情不闲聊 提交于 2020-02-25 07:55:33
ylbtech-JavaScript:Number 对象 1. Number 对象 返回顶部 Number 对象 Number 对象是原始数值的包装对象。 创建 Number 对象的语法: var myNum=new Number(value); var myNum=Number(value); 参数 参数 value 是要创建的 Number 对象的数值,或是要转换成数字的值。 返回值 当 Number() 和运算符 new 一起作为构造函数使用时,它返回一个新创建的 Number 对象。如果不用 new 运算符,把 Number() 作为一个函数来调用,它将把自己的参数转换成一个原始的数值,并且返回这个值(如果转换失败,则返回 NaN)。 Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用。 MAX_VALUE 可表示的最大的数。 MIN_VALUE 可表示的最小的数。 NaN 非数字值。 NEGATIVE_INFINITY 负无穷大,溢出时返回该值。 POSITIVE_INFINITY 正无穷大,溢出时返回该值。 prototype 使您有能力向对象添加属性和方法。 Number 对象方法 方法 描述 toString 把数字转换为字符串,使用指定的基数。 toLocaleString 把数字转换为字符串,使用

Java基础——对象和类

ⅰ亾dé卋堺 提交于 2020-02-24 23:05:25
  将包含main方法的类称为主类。   变量的作用域是指变量可以在程序中引用的范围。   实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。   局部变量的声明和使用都在一个方法的内部。   一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量成为局部变量。   局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。(Java没有给局部变量赋默认值)   无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。但当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。   类变量只能声明一次,但是在同一个方法内不同的非嵌套块中,可以多次声明相同的变量名。   可以在一个方法的不同块里声明同名的局部变量,但是,不能在嵌套块中或同一个块中两次声明同一个局部变量。   如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。   可以把两个类放在同一个文件中,但是文件中只能有一个类是公共(public)类。此外,公共类必须与文件同名。源代码中的每个类编译成.class文件。   构造方法在使用new操作符创建对象的时候调用,它是一种特殊的方法,有以下三个特殊性:    (1)构造方法必须具备和所在类相同的名字

值类型和引用类型

谁说胖子不能爱 提交于 2020-02-24 22:49:26
值类型和引用类型的区别 1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的 地址。 2.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 3. 值类型存取速度较快,引用类型存取速度较慢。 4. 值类型从System.ValueType类派生,引用类型从System.Object派生,其中,System.ValueType又是从System.Object 派生出来的,枚举从System.Enum抽象类派生,而System.Enum抽象类从System.ValueType派生出来的,所以枚举也是一个 值类型。 5.值类型不可能包含 null 值: 6.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 栈和堆的区别 栈就是编译期间就分配好的内存空间,堆是程序运行期间动态分配的内存空间 .net中哪些是值类类型,哪些是引用类型? 以结构体和类说明值类型和引用类型的区别 结构体--值类型,类--引用类型 区别:类当中默认的有一个无参数的构造方法(构造函数),当在类中写一个有参数的构造函数,默认无参数的构造函数被干掉了 类当中写构造函数参数列表中参数个数可以不确定,除了无参的构造函数之外,有参的构造函数也可以有多个重载 在结构中默认的也有一个无参数的构造函数

c#关于泛型和Object的效率问题,那个效率高

僤鯓⒐⒋嵵緔 提交于 2020-02-24 12:40:56
一个比较简单的功能,需要把一个未知类型转成我想要的数据类型。 例如:我想转成int int xx = GetValue<int>("1"); private static T GetValue<T>(string str) { return (T)Convert.ChangeType(str,typeof(T)); } 这一句就是先把内容转成object类型,然后再转成我需要的类型。 那如果换成: object obj = GetVlaue("abcd", str.GetType()); private static object GetVlaue(object o,Type t) { if (t.Name == "String") { return o.ToString(); } return null; } 按道理岂不是效率更高? 或者说有没有什么办法不用把泛型转成Object就能返回呢? 小弟正在了解这一部分,有什么错误的地方麻烦各位大佬谅解。 第一段代码肯定效率更高一些,因为是JIT一次榜定,后者反射每次调用一次就花费一次时间。 什么是泛型? C# 语言和公共语言运行时 (CLR) 在 2.0 版本中添加了泛型。泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有相同特征的类和方法:在客户端代码声明并初始化这些类和方法之前