引用类型

5.28课堂笔记之等值比较&equals()比较

匿名 (未验证) 提交于 2019-12-03 00:22:01
对象的生存周期可以大于变量的生存周期 *有可能造成溢出 byte 长度不一样的类型相互赋值时,短的可以给长的,长的不能给短的 运算符 :单目、双目、三目 ArithmeticException 运行时出错 (运行异常,算术异常) eg:17/0、0/0 实型 :运行无异常 17.0/0 = infinity(正无穷大) -17.0/0 = -infinity(负无穷大) 0/0.0=NaN 取余 整数取余:17/4=4 17%4=1 17%18=17 (被除数小于除数,则为被除数) 0%17=0 ArithmeticException 运行时出错 (运行异常) 17%0= 17.6 mod 4=1.6000000000014 小数不变,整数取余 17.6 mod 0=NaN -17.6 mod 0=NaN 0.0 mod 0=NaN 关系运算 5==3 false n1=130;n2=130; 等值比较(适用于基本类型、引用类型) Integer n1=new Integer(47); Integer n2=new Integer(47); n1==n2;false 地址是否一样,两个变量的内容比较 n1==n2; true 这两个变量指的是同一个对象 equals比较 (只限于引用类型。 基本类型不能用) n1.equals(n2);n2.equals(n1); true n1

CLRCore(CLR核心机制)

匿名 (未验证) 提交于 2019-12-03 00:11:01
JIT--第一次--标记已--存根--调用--查找存根--执行机器码 C#和CIL的关系: C#和N#都是CIL实现,但是彼此不能互通: C#和N#公开不分满足规范,我们才能互通 CLS就是描述多语言互通的规范 内存分配:线程栈   堆Heap:     一个程序运行时,该进程存放引用类型变量的一块内存,全局唯一!只有一个堆   栈Stack:     数据结构,先进后出,线程栈,一个线程存放变量的内存(一个线程有一个)   值类型分配在栈上,比如结构、枚举、int等   引用类型分配在堆上,比如类、接口、委托等 引用类型   1、调用new的时候,就会去栈上开辟内存,创建实例。这就是为什么在构造函数中跨域使用this   2、把实例的引用传递给构造函数   3、执行构造函数   4、返回引用 装箱拆箱 int i = 3 ; obect obj = i ; //装箱 int k =( int ) obj ; //拆箱 引用类型在哪里?值类型在哪里?   值类型的值,会随着对象的位置存储。引用类型的值,一定在堆里面。值类型的长度是确定的,引用类型的长度是不确定的,只有堆才能放各种值。   下面有一个例子: public class MyTest { private int x ; public MyTest ( int n ) { this . x = n ; } } MyTest

C# 第2次实验报告:C#编程基础

匿名 (未验证) 提交于 2019-12-03 00:03:02
文章目录 一、实验目的及要求 二、实验内容(或实验原理、实验拓扑) 练习1:C# 几种数据类型转换方式。 练习2:定义一个变量保存一个分数,判断该分数属于什么等级。 练习3:从一个整数数组中取出最大的整数。 三、实验设备与环境 四、实验设计方案(包括实验步骤、设计思想、算法描述或开发流程等) 五、实验结果(包括设计效果、测试数据、运行结果等) 六、实验小结(包括收获、心得体会、注意事项、存在问题及解决办法、建议等) 七、附录(包括作品、流程图、源程序及命令清单等) 一、实验目的及要求 掌握类型之间的转换方法; 掌握C#语言的选择语句、循环语句、跳转语句的使用; 掌握数组的定义和使用,掌握foreach语句的使用。 二、实验内容(或实验原理、实验拓扑) 练习1:C# 几种数据类型转换方式。 (int)变量名[强制类型转换] int.Parse(string 变量名)。 int.TryParse(string s, out int result) Convert.ToInt32 练习2:定义一个变量保存一个分数,判断该分数属于什么等级。 60分以下E,60 ~ 70D,70 ~ 80C,80 ~ 90 B,90或90以上是A。 练习3:从一个整数数组中取出最大的整数。 三、实验设备与环境 I7 7700HQ+16G内存+38TB分布式硬盘的笔记本电脑、Windows 10

栈 与 堆

匿名 (未验证) 提交于 2019-12-02 23:54:01
1、使用场景:栈记录代码执行的路径;堆保存引用类型的实例。 2、栈自行维护,一个步骤执行完,自动从栈顶弹出;堆需要GC来进行垃圾回收。 3、数据可以分为四类:值类型、引用类型、引用、指令。其中,引用是指类型为引用类型的变量,指令是指一个一个的操作。 4、内存分配:引用类型总是分配在堆上;值类型和引用总是分配在它们被声明的地方;指令总是分配在栈上。 5、值类型在赋值或者参数传递时,总是“整体拷贝”;引用类型在赋值或者参数传递时,总是“复制引用”。如果要想让值类型具备“复制引用”的特点,需要使用ref 关键词。如果要让引用类型具备“整体拷贝”的特点,需要让引用类型 ICloneable接口,实现接口中的方法Clone 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/18/2325240.html 转载请标明出处: 栈 与 堆 文章来源: https://blog.csdn.net/weixin_30608131/article/details/99234333

C# 值类型 与 引用类型

匿名 (未验证) 提交于 2019-12-02 23:54:01
先看MSDN上对CTS 中的值类型和引用类型之间的关系的介绍: 1、Object是所有类型的根,类型分为:值类型和引用类型。 2、ValueType 是所有值类型的根(结构是隐式继承ValueType),值类型分为:结构和枚举。结构包括:BCL中的结构(也就是基础类型Primitive Type)和自定义的结构。 3、ValueType 继承Object,ValueType本身是个class(引用类型),而ValueType的子类(结构和枚举)都是值类型,ValueType重写了Object的Equals方法,将引用的比较转化为引用内容的比较。 4、所有的值类型都是sealed 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/10/2318279.html 文章来源: https://blog.csdn.net/weixin_30214115/article/details/99234361

==和equls的区别

匿名 (未验证) 提交于 2019-12-02 23:43:01
  总结来说:   1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;     如果作用于引用类型的变量,则比较的是所指向的对象的地址   2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量     如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;     诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

.NET CLR GC的知识点汇总

匿名 (未验证) 提交于 2019-12-02 23:42:01
GC的处理流程 GC暂停进程中的所有线程。 GC遍历堆中的所有对象,将某个位(这个位包含在对象同步块索引的字段中)设置为0(0表示将被删除)。 GC检查所有活动根(根是指引用类型的变量),把活动根指向的对象标记为1,再次该对象引用的其它对象标记为1,依次类推。 GC将活动对象进行重新排列,让所有幸存对象在内存中紧挨在一起。 将移动过的幸存对象的根更新固定的偏移量。 GC恢复进程中的所有线程。 GC对活动对象(活动根)的认定: 被任何静态对象或静态字段引用。 应用程序栈中引用类型的变量指向的对象。 应用程序中的本地引用类型变量。 应用程序方法中的引用类型参数。 等待被终结(finalized)的对象。 GC将活动对象进行重新排列后获得的好处: 减少活动对象的内存地址范围,提升访问活动对象的性能。 让剩余的内存空间变成连续的,便于后续分配给新对象。 解决原生堆(非托管堆)的内存碎片问题。 GC代的算法的出发点: 对象越新,生存期越短。 对象越老,生存期越长。 回收堆的一部分,速度快于回收整个堆。 GC关于代的算法流程: 初始化堆,接下来分配的所有对象都是0代。 某个时间点0代超过预算,触发一次GC回收。 幸存下来的对象从0代提升到1代,此时0代不包含任何对象。 对1代对象进行紧凑排列。 在0代为新对象分配内存。 一段时间后再次触发GC对0代进行回收。

值类型和引用类型区别

匿名 (未验证) 提交于 2019-12-02 22:10:10
值类型 和引用类型的介绍 直接上代码看: public class Study { public static int initNo = 100; public static void Test1(int i) { i = 1; } public static void Test1(ref int i) { i = 1; } public static void Test2(TestModel testModel) { testModel.a = 10; testModel.b = 100; } public static void Test3(TestModel testModel) { testModel = new TestModel(); testModel.a = 10; testModel.b = 100; } public static void Test() { int i = 0; Test1(i); initNo = i; // 此时这里的i还是0,因为int是值类型。 Test1(ref i); initNo = i; //此时这里的i就变成了1. //引用类型 TestModel ts = new TestModel(); ts.a = 1; ts.b = 2; Test2(ts); // 此时这里的ts.a变为10,因为TestModel是引用类型

CLR-2-2-引用类型和值类型

匿名 (未验证) 提交于 2019-12-02 22:10:10
引用类型和值类型,是一个老生常谈的问题了。装箱拆箱相信也是猿猿都知,但是还是跟着CLR via C#加深下印象,看有没有什么更加根本和以前被忽略的知识点。 引用类型: 引用类型有哪些这里不过多赘述,来关心一下它在计算机内部的实际操作,引用类型总是从托管堆分配,线程栈上存储的是指向堆上数据的引用地址,首先确立一下四个事实: 所以引用类型对性能是有显著影响的。 值类型: 值类型是CLR提供的轻量级类型,它把实际的字段存储在线程栈上 值类型不受垃圾回收器的限制,所以它的存在缓解了托管堆的压力,也减少了垃圾回收的次数。 值类型都是派生自System.ValueType 所有值类型都是隐式密封的,目的是防止将值类型作为其他引用类型的基类 值类型初始化为空时,默认为0,它不像引用类型是指针,它不会抛出 NullReferenceException 异常,CLR还为值类型提供了可控类型。 误区防范:根据我自己的经验,要避免对引用类型值类型赋值的错误认识,我们先需要清楚,定义值类型,引用类型的底层实际操作,下面先根据流程图了解一下: 例子: 1 class SomeRef{public int x;} 2 struct SomeVal{public int x;} 3 4 staic void Test 5 { 6 SomeRef r1=new SomeRef(); 7 SomeVal v1

C# 装箱和拆箱

匿名 (未验证) 提交于 2019-12-02 22:06:11
Object类型是所有类型的基类,其下面有ValueType类型。什么结构啊,枚举啊,都继承ValueType,这些都是值类型。其他的什么类啊,数组啊,字符串啊等等都是引用类型。 简单的说,直接继承Object的都是引用类型,继承ValueType的都是值类型。 那样的话,像整形这样的结构按理说其实也是间接继承自Object的,那么按照里氏替换原则,整形转换成object应该没有问题吧。 像上面的代码,这个b还是值类型吗?如果是值类型,好像又和直接继承Object都是引用类型矛盾了啊。其实这就是“装箱”。A是值类型,变成b,而成了Object类型,其实就变成了引用类型,简单的说装箱就是将值类型转成引用类型。与之对应的拆箱,将引用类型变成值类型。 那不就是个类型转换吗?还整个什么拆箱和装箱这样难听的名字! 错!值类型和引用类型之间的转换与什么一般的子类转父类,父类转子类不一样,他这种转换可涉及到存储上的变化 double d = 2.8; object obj = d; //装箱操作,要尽量避免装箱 d=(double)obj; //拆箱操作,影响性能,要避免拆箱操作 隐式转换:不需要声明就能转换的转换 int i=221; long j=i; 显式转换:又称“强制转换” double x=25.0123; int y=(int)x; int y=Convert.ToInt32(x)