引用类型

C# 中的数据类型整理

只愿长相守 提交于 2020-04-08 11:57:35
在 C# 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 值类型(Value types) 值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。 值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。 下表列出了 C# 2010 中可用的值类型: 类型 描述 范围 默认值 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U +0000 到 U +ffff '\0' decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0 long 64 位有符号整数类型 -9,223

==和equals的区别

不想你离开。 提交于 2020-04-08 10:55:54
== 解读: 对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 代码示例: String x = "string" ; String y = "string" ; String z = n String( "string" ); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true 代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。 equals 解读: equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。 首先来看默认情况下 equals 比较一个有相同值的对象,代码如下: class Cat { public Cat(String name) { this.name = name; } private

C#学习笔记(一)

谁说我不能喝 提交于 2020-04-07 05:37:46
C#学习笔记(一):C#与C++语法的一些不同 1,C#中没有了"::"的域操作符,全部用了"."了。但是继承还是用的":",C#的"::"是用作命名空间别名的修饰符。 2,在C#中变量使用前必须初始化,程序员显式的或者编译器自动的。其中:变量是类或者结构中的字段,如果没有显式初始化,则在默认创建这些变量的时候其值就是0。然而方法的局部变量必须在代码 中显式初始化。(这与C++中不同)。 3,例如对于下面语句:SomeType obj;在C++这个是一个值类型,会在堆栈中创建一个SomeType的实例。但是在C#中这个只会为SomeType对象创建一个引用,这个引用还没有指向任何的对象。也就不能调用它的方法。然而C#中实例化对象要使用new关键字,将对象存储在堆上。返回一个引用。 4,下面的代码: public static in Mian() { int j = 20; for (int i = 0; i < 10; i++) { int j = 30; //....use value j... } } 与C++不同的是这个时候C#不能隐藏for循环的变量:j,前面的j还在定义域中。但是对于下面代码: static int j = 20; public static void Main() { int j = 30; //....use j } 这个就是可以的,这个是静态变量

对象访问定位

ぐ巨炮叔叔 提交于 2020-04-07 00:45:52
句柄访问 jvm栈中的引用类型指向java堆里的句柄池,句柄池指针分别指向对象实例和类型;好处是:引用类型指针永远指向句柄池地址,新的对象创建的时候只是句柄池指针有变化而已; 直接指针访问 引用类型直接指向对象实例,对象头的类型指针指向方法区里的类型文件(class文件);好处是寻找对象非常快 来源: oschina 链接: https://my.oschina.net/u/1792430/blog/667843

浅谈浏览器垃圾回收机制

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-06 12:38:30
javaScriipt 使用垃圾回收机制来自动管理内存 js 的回收机制目前分为两种方式:1.标记清除(各大浏览器主流算法)2.引用技术   一: 标记清除     这种算法的思想是给当前不使用的值加上标记,然后再回收其内存     算法流程:       1.浏览器再运行的时候会给存储再内存中的所有变量都加上标记       2.去掉环境中的变量以及被环境中引用的变量的标记       3.如果还有变量有标记,就会被视为准备删除的变量       4.垃圾回收机制完成内存的清除工作,销毁那些带标记的变量,并回收他们所占用的内存空间   二:引用计数     这种算法的思想是跟踪记录所有值被引用的次数。javaScript 引擎目前都不再使用这种算法,但再IE 中访问非原生JavaScriopt 对象(如DOM元素)时,这种算法任然可能会导致问题     当代码中存在循环引用现象时,引用计数算法就会导致问题     解除变量的引用不仅可以帮于消除循环引用现象(一个变量使用完之后赋值为null),而且对垃圾收集也有好处。为了确保有效的回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用     算法流程:       1.声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值引用次数就是1       2.同一个值又被赋值另一个变量

浅谈值类型和引用类型在堆和栈中的存储二

断了今生、忘了曾经 提交于 2020-04-03 23:35:56
前一篇我们浅谈了“堆”和“栈”,这篇文章我们主要谈一下值类型和引用类型在作为参数传递时候,有什么不同。 主要分为两种情况: 1.传递值类型(Passing Value Types) 2.传递引用类型(Passing Reference Types) 首先我们来看一下第一种情况, 传递值类型(Passing Value Types) : public void Go() { var x = 5; AddFive(x); Console.WriteLine(x.ToString()); } public int AddFive(int pValue) { pValue += 5; return pValue; } 上一篇文章我们已经讨论过关于值类型存储的问题,所以这里不再过多叙述。 我们都知道,值类型使用的就是数据本身,所以5会被拷贝到pValue。所以最终x的值还是不会改变。 需要谨记的是,如果我们将一个非常大的值类型变量(如一个很大的struct)复制到“栈“上,这对内存空间和处理器处理周期的消耗是很大的,因为”栈“空间并非无限的。 如何解决这种效率低的问题呢?先别慌,让我们来看一个例子。 public void Go() { MyStruct x = new MyStruct(); DoSomething(ref x); } public struct MyStruct {

[No000018A]改善C#程序的建议11-20

别说谁变了你拦得住时间么 提交于 2020-04-03 18:32:04
建议11:区别对待 == 和Equals CLR中将“相等性”分为两类: 1、值相等性:两个变量包含的数值相等。 2、引用相等性:两个变量引用的是内存中的同一个对象。 但并不是所有的类型的比较都是按照其本身,比如string是一个特殊的引用类型,但是在FCL中,string的比较就被重载为针对“类型的值”的比较,而不是“引用本身”的比较。对于自定义类型来说,如果想要实现这样的值比较而不是引用比较的话,则需要重载Equals方法,比如对于Person类,如果IDCode相同,我们可以认为他们是同一个人。 class Person { public string IDCode { get; private set; } public Person(string idCode) { this.IDCode = idCode; } public override bool Equals(object obj) { return IDCode == (obj as Person).IDCode; } } 此时通过Equals去比较的话,则就会通过重载后的方法来进行了。 object a = new Person("ABC"); object b = new Person("ABC"); Console.WriteLine(a == b); //False Console.WriteLine

C#--深入理解类型

女生的网名这么多〃 提交于 2020-04-03 14:33:19
List分组迭代器 说明: 针对长度较大的List对象,可以分组批量进行处理, 如:长度为1000的List对象,可分为10组,每组100条,对数据进行业务逻辑处理... Source /****************************************************************************** * 名称:List分组迭代器 * 说明:针对长度较大的List对象,可以分组批量进行处理 * 如:长度为1000的List<int>对象,可分为10组,每组100条,对数据进行业务逻辑处理 * 作者:Sybs * 时间:2018-10-15 * **************************************************************************/ namespace System.Collections.Generic { /// <summary> /// List分组迭代器 /// </summary> public class ListGroupIterator<T> { private int _groupsize = 1; /// <summary> /// 分组大小(缺省值为1) /// </summary> public int GroupSize { get =>

C#--深入理解类型

北战南征 提交于 2020-04-03 14:29:56
今日无事,回顾了一下C#基础知识,颇有收获,就自己的理解,写了这篇文章,如有不对,欢迎指正。 C#中的类型可以分为两类:值类型与引用类型,如下图所示。 值类型通常被分配到线程的堆栈上,而引用类型则被分配到托管堆上。例如下面例子: valuetype和reftype在内存中的位置如下所示: 从上面可以看出,值类型与引用类型的区别在于实际数据的存储位置: 值类型的变量和实际数据都存储在堆栈中;而引用类型只有变量存储在堆栈中,变量储存着实际数据的地址,实际数据储存在与地址相对应的托管堆中。 但是,上边所说的情况并不是绝对的,也就是说值类型的实例不一定分配到线程堆上。 1 、应用类型中嵌套定义值类型 以上代码内存分配情况如下: 如果类的字段类型是值类型,他将作为引用类型实例的一部分,被分配到托管堆中。但那些作为局部变量(例子中的 c变量)的值类型,则依然会被分配到托管堆中。 2. 值类型中嵌套定义引用类型 内存分配如下: 值类型实例总会被分配到它声明的地方,声明的是局部变量时,将分配到栈上,而声明为引用类型成员时,则被分配到托管堆上;而引用类型实例总是被分配到托管堆上。 值类型与引用类型除了在内存上分布方面的区别,还有以下几个方面的区别: 1、值类型继承自ValueType,ValueType又继承自System.Object;而引用类型则直接继承自System.Object; 2

深入理解类型

无人久伴 提交于 2020-04-03 14:27:14
什么是值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型与引用类型的区别 两类型的数据存储位置不同 在引用类型中嵌套值类型时,或者在值类型装箱的情况下,值类型的实例就会被分配到托管堆上 值类型继承自 ValueType , ValueType 又继承自 System.Object ;而引用类型则直接继承于 System.Object ; 值类型的内存不受 GC 控制,作用域结束时,值类型会被操作系统自行释放 若值类型为密封的(sealed),你将不能把值类型作为其他任何类型的基类;而引用类型则一般具有继承性,这里是指接口和类; 值类型不能为 null 值,它会被默认初始化为该值类型的默认值;而引用类型默认会初始化为 null 值,表示不指向托管堆中的任何地址;对值为 null 的引用类型的任何操作都会引发 NullRefernceException 异常 由于值类型变量包含其实际数据,因此默认情况下,值类型之间的参数传递不会影响变量本身;而引用类型变量保存的是数据的引用地址,它们作为参数传递时,参数会发生改变,从而影响引用类型变量的值 几种类型嵌套情况 引用类型中嵌套定义值类型 如果类的字段类型是值类型,它将作为引用类型实例的一部分,被分配到托管堆中,但那些作为局部变量(如下代码中的 c 变量)的值类型,则仍然会被分配到线程堆栈中. 代码示例 /