引用类型

C#基础---值类型和引用类型

走远了吗. 提交于 2020-04-03 14:22:55
1、先附上一份值类型和引用类型各自的成员        2、值类型和引用类型的区别 值类型直接存储其 值 ,引用类型存储其值的 引用 值类型变量都存储在堆 栈 中,引用类型在托管 堆 中分配存储单元 值类型变量不能为null,必须有确定的值,引用类型被赋值前的值都是null 值类型是从System.ValueType类继承而来的类型 3、值类型 struct类型:由一系列具有相同类型或不同类型的数据构成的数据集合 static void Main(string[] args) { Person person = new Person(); person.age = 10; Console.WriteLine(person.age); Console.Read(); } struct Person { public int age; public string name; public string fname; public string lname; } enmu类型:   3、类型转换 隐式转换:从类型A转换成类型B的转换可在任何情况下进行,转换规则简单,可由编译器自行完成转换。 显示转换:从类型A转换成类型B的转换只能在某些情况下进行,转换规则较复杂,应进行某些类型的处理。 装箱:将值类型转换成引用类型的过程。 拆箱:将引用类型转换成值类型的过程。 4、常量

面试题: c#值类型和引用类型

ぐ巨炮叔叔 提交于 2020-04-03 13:28:15
c#值类型和引用类型 在C#中, 值类型 :整型、布尔型、字符型、实数型、结构型、枚举型。 引用类型 :类、对象、字符串、数组、接口、委托。 区别: 1、值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高。 2、引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例。 3、值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。 4、值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以引用方式进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。 5、值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。我会在下节以专门的篇幅来深入讨论这个话题。 6、典型的值类型为:struct,enum以及大量的内置值类型;而能称为类的都可以说是引用类型。 7、值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成,微软甚至建议用户最好不要自行释放内存。

C#中使用ref和out一点认识

安稳与你 提交于 2020-04-03 11:51:56
摘自internet ref侧重修改.out侧重输出. 首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System; class Test {     static void Swap(ref int x, ref int y)     {         int temp = x;         x = y;         y = temp;     }     static void Swap(int x,int y)     {         int temp = x;         x = y;         y = temp;     }     static void Main()     {         int i = 1, j = 2;         Swap(ref i, ref j);         Console.WriteLine("i = {0}, j = {1}", i, j);         Swap(i,j);         Console.WriteLine("i = {0}, j = {1}", i, j);     } }   程序经编译后执行输出: i = 2, j = 1 i = 2, j = 1 这是csdn的一篇帖子上的例子.其实如果放在一起

三、C#入门—数据类型

浪尽此生 提交于 2020-04-01 10:58:28
三、C#数据类型   3.1.变量     声明->赋值->使用      作用域:变量作用域为包含它的大括号内   3.2.常量     1)const 数据类型 常量名称 = 常量值       声明常量时一定要赋值     2)@作用 输出转义字符  @"Hello World\n" 让字符串换行   关键字用作标识符 @namespace @class ..   3.3.数据类型之值类型     1)C#预定义的数据类型包括两种:值类型、引用类型       区别:       值类型是在栈中操作,引用类型则在堆中分配存储单元       传递类型方式不同     2)内存分配:       栈  --> 局部变量       堆  --> new/malloc       .data --> 已初始化的全局变量、静态变量,可读写       .bss --> 未初始化全局变量、静态变量,可读写       data --> 常量区,只读           code --> 代码区,只读     3)值类型包括数值类型、布尔类型和字符类型   3.4.数据类型之引用类型     1)引用类型包括对象(object)和字符串(string)       object类型:所有其他类型的基类型       字符串:不可变性,当你给一个字符串重新赋值后,老值并没有摧毁

net中String是引用类型还是值类型

孤者浪人 提交于 2020-03-31 09:12:34
关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确。希望能给大家带来点帮助。 如果有错误请指出。 来看下面例子: //值类型 int a = 1; int b = a; a = 2; Console.WriteLine("a is {0},b is {1}", a, b); //字符串 string str1 = "ab"; string str2 = str1; str1 = "abc"; Console.WriteLine("str1 is {0},str2 is {1}", str1, str2); Console.Read(); 根据上面的例子:你觉得输出结果应该是什么? 输出结果: //结果: //a is 2,b is 1 //str1 is abc,str2 is ab str2依然是ab,并没有随str1的改变而改变。 如果string是引用类型,按理Str1和Str指针都指向同一内存地址,如果Str的内容发生改变,Str1应该也会相应变化。 此例子,看着string更像是值类型。 但是MSDN却说String是引用类型, 引用类型包括: String 所有数组,即使其元素是值类型 类类型,如 Form 委托 可参考: http://msdn.microsoft.com/zh-cn/library

JAVA 几种引用类型学习

ⅰ亾dé卋堺 提交于 2020-03-31 08:02:10
1、对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 图1为对象应用类层次 1)强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机 宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 2)软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 3) 弱引用(WeakReference) 弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期

第三章 CLR如何解析引用类型

孤人 提交于 2020-03-27 21:56:28
C# 编译器将代码打包成托管模块后,接着会将这些模块合并成程序集,然后统一加载到一个具体的目录, CLR 在这个目录查找并且加载所需要的 DLL 或者 exe. 程序集分类:弱命名程序集和强命名程序集 , 强命名程序集用发布者的公钥 / 私钥签名发布 详细点比如你生成的程序集的 System.Object 他在 mscorlib.dll 种定义 mscorlib.dll 就是一种强命名程序集 , 上面用了一些已知的安全策略。 程序集采用两种部署方式:私有或者全局。 要搞清楚如何解析得先了解元数据的数据结构: 结合元数据表看下图:此处类容可以参考第一篇,第二篇: https://www.cnblogs.com/LiMin/p/10712789.html https://www.cnblogs.com/LiMin/p/10712852.html 有稍微帮助 前三篇不强迫大家熟悉,因为个人感觉就是本来这个偏向理论仅作了解。 来源: https://www.cnblogs.com/LiMin/p/10727504.html

笔记第十四天

六月ゝ 毕业季﹏ 提交于 2020-03-26 21:36:39
异常处理用途: 1、保证程序的正常运行 2、辅助来调试程序 try-catch-finally java中最常用的异常处理方法 throw throws 抛出异常 当不符合程序的业务需求时(但是是符合Java的语法的),自己产生一个异常 业务:功能要怎么做,做成什么样的 throw 声明一个异常 对异常的两种处理方式 1、捕获、处理 try-catch 2、thorws 继续向外, 不要抛给JVM 扩展:自定义异常类 PayException 自定义的异常,一定要自己抛出 调试程序:debug 错误:语法性质的 红色波浪线 对于错误,必须修正,否则无法编译、运行 bug:缺陷,不是错误,是因为设计不全面带来的漏洞 需要调试程序来发现bug 1、设置断点 断点:程序执行到断点的位置会中断运行 双击 设置或取消断点(有效代码行:注释、{}等无效) 2、程序需要调试运行 debug as 2.1绿色背景:代表程序当前所执行的行 2.2 上方右侧 变量区 Varlables 中间左侧 代码执行区 下方 运行结果 3、F5、F6 每按一次,代码向下执行一行 F6:如果执行的代码是调用方法的代码,不会进入到方法的内部 F5:如果执行的代码是调用方法的代码,会进入到方法内部 F5注意:可以进入自己编写的方法内部 Java中的系统类: Java中分两个大的数据类型种类: 1)基本数据类型:8个 2

JavaScript引用类型之Array数组的排序方法

点点圈 提交于 2020-03-26 02:33:17
数组中已经存在两个JavaScript给我们定义好的重排序的方法:reverse()和sort()方法,下面来简单分析下: 1、reverse() 用于反转数组项的顺序,代码如下: <script> var colors=[1,2,3,4,5]; colors.reverse(); alert(colors.toString()); //输出:5,4,3,2,1 </script> 这里数组的初始顺序是1、2、3、4、5,调用数组的reverse()方法后,其值顺序变为5、4、3、2、1 2、sort() 用法:arrayobj.sort(sortfunction) 参数说明: (1)arrayObj 必选项,任意 Array 实例。 (2)sortFunction 可选项,是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。 注意:sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。 如果为 sortfunction 参数提供了一个函数,那么该函数必须为下列返回值之一: 负值,如果所传递的第一个参数比第二个参数小。 零,如果两个参数相等。 正值,如果第一个参数比第二个参数大。 没有给sort()方法指定排序规则的代码如下: <script> //使用方法:arrayobj.sort

面向对象特征:继承、多态

情到浓时终转凉″ 提交于 2020-03-25 04:32:34
继承 ·为什么要有继承?   多个 类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 ·此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:子类 is a 父类 ·类继承语法规则: class Subclass extends Superclass{} 作用:   继承的出现提高了代码的复用性   继承的出现让类与类之间产生了关系,提供了多态的前提   不要仅为了获取其他类中某个功能而去继承 ·子类继承了父类,就继承了父类的方法和属性 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。 ·在Java中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。 关于继承的规则:   子类不能直接访问父类中私有的(private)的成员变量和方法。 ·Java只支持单继承,不允许多重继承   一个子类只能有一个父类   一个父类可以派生出多个子类 方法的重写(override) ·定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。 ·要求   重写方法必须和被重写方法具有相同的 方法名称、参数列表和返回值类型 。   重写方法不能使用比被重写方法更严格的访问权限。