引用类型

c#中的引用类型和值类型

*爱你&永不变心* 提交于 2020-02-24 00:09:07
一,c#中的值类型和引用类型 众所周知在c#中有两种基本类型,它们分别是值类型和引用类型;而每种类型都可以细分为如下类型: 什么是值类型和引用类型 什么是值类型: 进一步研究文档,你会发现所有的结构都是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的。根据定义所知,所有的值类型都必须从System.ValueType派生,所有的枚举都从System.Enum抽象类派生,而后者又从System.ValueType派生。 所有的值类型都是隐式密封的(sealed),目的是防止其他任何类型从值类型进行派生。 什么是引用类型: 在c#中所有的类都是引用类型,包括接口。 区别和性能 区别: 值类型通常被人们称为轻量级的类型,因为在大多数情况下,值类型的的实例都分配在线程栈中,因此它不受垃圾回收的控制,缓解了托管堆中的压力,减少了应用程序的垃圾回收的次数,提高性能。 所有的引用类型的实例都分配在托管堆上,c#中new操作符会返回一个内存地址指向当前的对象。所以当你在创建个一个引用类型实例的时候,你必须要考虑以下问题: 内存是在托管堆上分配的 在分配每一个对象时都会包含一些额外的成员(类型对象指针,同步块索引),这些成员必须初始化 对象中的其他字节总是设为零 在分配对象时,可能会进行一次垃圾回收操作

对象内有多个对象型的成员变量怎么实现深克隆

人走茶凉 提交于 2020-02-22 12:15:17
浅克隆和深克隆 在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制。 1、浅克隆 在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。 简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。 在Java语言中,通过 覆盖Object类的clone()方法可以实现浅克隆 。 浅克隆的实现: 1. 被复制的类需要实现Clonenable接口 (不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法) 2. 覆盖clone()方法,访问修饰符设为public 。 方法中调用super.clone()方法得到需要的复制对象 。(native为本地方法) class Student implements Cloneable{ private int number; public int getNumber() { return

JAVAEE第五章 final 权限修饰(public private proteced) 内部类

一世执手 提交于 2020-02-22 12:14:14
学习内容 final修饰类的使用 final修饰方法的使用 权限修饰(public private protected default)的作用域 内部类概念及使用 引用类型作为成员变量 引用类型作为传入参数 引用类型作为返回值类型 第一节 final关键字 概述 子类可以继承父类,同时子类可以修改父类中的成员变量也可以重写父类的方法,由此带的问题是安全问题,当我们不想让任何类修改变量和方法的时候,可以用final关键. final可以修饰类、变量、方法 1- 被修饰的类不能被继承 2- 被修饰的方法不能重写 3- 被修饰的成员变量不能再修改 使用格式 修饰类 final class 类名{} 修饰方法 修饰符 final 返回值类型 方法名(参数){} 修饰变量 修饰基本类型的话,变量只能赋值一次,再次赋值会报错. 修饰引用类型的话,同一个变量只能指向同一个对象地址,不能再次赋值 大部分我们是用来修饰引用变量 //修饰基本类型 final int num = 1 ; num = 2 ; //再次赋值报错 final User user = new User ( "张三" ) ; user = new User ( "李四" ) ; //在new一个新的User对象会报错 小贴士:一般被final修饰的变量,都用大写来表示 第二节权限修饰符 概述 JAVA提供给了四种权限修饰符 1

js引用类型基础——数组

别来无恙 提交于 2020-02-21 23:46:13
数组,顾名思义就是将一组数组合在一起,即数组是数据的有序集合。 js数组是无类型的,数组元素可以是任意类型数据, js数组是动态的,根据需要它们会增长或缩减。 我们知道数组是对象,数组的索引其实相当于对象的属性名,只不过这里只能用方括号来访问。 创建数组 (1)构造函数法 使用Array()构造函数可以创建一个数组。 var a = new Array(); //创建一个新数组 var b = new Array(10); //创建长度为10的空数组,10并非是数组元素个数的上限 (2)字面量表示法 使用方括号创建数组,数组元素用逗号隔开。 var color = ["blue","red","yellow"]; var count = [1,,3]; //数组有3个元素,中间的元素为undefined var undefs = [,,,]; //不要这样写,会被当做3或者4个元素,视浏览器而定 上述数组count中间的元素若显式的定义为undefined,情况略有不同 虽然二者的数组长度都是3,但是前者是个稀疏数组,元素个数只有2,后者是稠密数组,元素个数为3。 数组长度 数组有一个length属性,一般情况下,length属性值等于数组元素的个数。当数组是稀疏数组时length值大于数组元素个数 数组长度是动态的,因此可以通过改变length属性值来增删数组元素

《Head First Java》笔记

别说谁变了你拦得住时间么 提交于 2020-02-18 17:03:59
笔记只记录自己学习时遇到的重点(复习),全文参考《Head First Java》 第二天 一、primitive主数据类型和引用 一、值类型和引用类型的区别 值类型 通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高。 整型3种 byte,short,int,long 浮点型2种 float,double 字符型1种 char 逻辑型1种 boolean 引用类型 分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例 数组,类,接口,字符串 来源: CSDN 作者: 贝尔卡 链接: https://blog.csdn.net/hello_tsyh/article/details/104365750

class和struct

半城伤御伤魂 提交于 2020-02-18 14:40:35
转自: http://www.cnblogs.com/anytao/archive/2007/04/24/must_net_04.html 本文将介绍以下内容: • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct,我们首先的感觉是语法几乎相同,待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程,class和 struct也背负着各自的命运前行。在我认为,struct英雄迟暮,class天下独行,最本质的区别是class是引用类型,而struct是值类 型,它们在内存中的分配情况有所区别。由此产生的一系列差异性,本文将做以全面讨论。 2. 基本概念 2.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。因为是基本 的概念,所以不必在此详细描述,读者可以查询相关概念了解。我们重点强调的是.NET中,所有的类都最终继承自System.Object类,因此是一种 引用类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。 2.2. 什么是struct? struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体

C# 知识回顾 - 装箱与拆箱

耗尽温柔 提交于 2020-02-17 23:24:06
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- 《C 语言从入门到放弃》 ,下单成功后,卖家会帮你将这本入坑指南打好包装,我们可以称之为装箱;经过快递员的快马加鞭,风雨无阻,包裹就直接送到你手上了。你一定会以迅雷不及掩耳盗铃儿响叮当之势拆开包装,这个过程我们可以称之为拆箱,这时,入坑指南就顺利的送到你手上。 C# 的装箱与拆箱   装箱:将值类型(如 int ,或自定义的值类型等)转换成 object 或者接口类型的一个过程。当 CLR 对值类型进行装箱时,会将该值包装为 System.Object 类型,再将包装后的对象存储在堆上。 拆箱就是从对象中提取对应的值类型的一个过程。   装箱是隐式的;拆箱必定是显式的。   相对于简单的赋值而言,装箱和拆箱都需要进行大量的数据计算。对值类型进行装箱时,CLR 必须重新分配一个新的对象。拆箱所需的强制转换也需要进行大量的计算,只是相比,程度不高,并且也可能会出现类型转换的异常情形。如果你的操作正处于循环的中心,通过测试(如:Stopwatch),你会很明显的感觉到性能问题。   .NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问题,也减少了类型转换所引起的运行时的异常,从而提高了性能。

基本类型和引用类型

大城市里の小女人 提交于 2020-02-16 09:30:48
原文链接:https://blog.csdn.net/qq_31071255/article/details/82192075 Java 基本数据类型与引用类型 变量就是申请内存来存储值。也就是说,当创建变量的时候, 需要在内存中申请空间 。 内存管理系统 根据变量的类型为变量分配存储空间 ,分配的空间只能用来储存该类型数据。 Java中有两大类型 内置数据类型(基本数据类型) 引用数据类型 内置数据类型(基本数据类型) Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 byte: byte 数据类型是8位、有符号的,以二进制补码表示的整数; 最小值是 -128(-2^7),也就是一个字节; 最大值是 127(2^7-1); 默认值是 0; byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一; 例子:byte a = 100,byte b = -50。 short: short 数据类型是 16 位、有符号的以二进制补码表示的整数 最小值是 -32768(-2^15); 最大值是 32767(2^15 - 1); Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一; 默认值是 0 例子:short s = 1000

《C#高级编程(第6版)》第5章筆記----第5章数 组

泪湿孤枕 提交于 2020-02-16 03:19:15
数 组 如果需要使用同一类型的多个对象,就可以使用集合和数组。C#用特殊的记号声明和使用数组。Array类在后台发挥作用,为数组中元素的排序和过滤提供了几个方法。 简单数组 在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。 声明了数组后,就必须为数组分配内存,以保存数组的所有元素。数组是引用类型,所以必须给它分配堆上的内存。为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。 访问数组元素 数组在声明和初始化后,就可以使用索引器访问其中的元素了。数组只支持有整型参数的索引器。 使用引用类型 不但能声明预定义类型的数组,还可以声明定制类型的数组。 多维数组 一般数组(也称为一维数组)用一个整数来索引。多维数组用两个或多个整数来索引。 锯齿数组 而锯齿数组的大小设置是比较灵活的,在锯齿数组中,每一行都可以有不同的大小。 在声明锯齿数组时,要依次放置开闭括号。在初始化锯齿数组时,先设置该数组包含的行数。定义各行中元素个数的第二个括号设置为空,因为这类数组的每一行包含不同的元素数。 Array类 用括号声明数组是C#中使用Array类的记号。在后台使用C#语法,会创建一个派生于抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性了。 创建数组 Array类是一个抽象类,所以不能使用构造函数来创建数组

解决方案是使用 default 关键字,此关键字对于引用类型会返回空

烈酒焚心 提交于 2020-02-16 00:21:30
解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。 C#中泛型默认关键字(default)详解 https://www.cnblogs.com/phone15138028025/p/4447213.html 我们在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:(T 是引用类型还是值类型?)对此我们将如何处理?   C#代码实例:   /// <summary>   /// 获取DataRow字段值   /// </summary>   /// <typeparam name="T">类型</typeparam>   /// <param name="row">数据行</param>   /// <param name="columnName">列明</param>   /// <returns></returns>   public static T RowToT<T>(this DataRow row, string columnName)   {     try     {       return !row.Table.Columns.Contains(columnName) || row