C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)
托管和非托管资源
1.托管资源是指GC管理的内存空间,非托管资源是指文件句柄,网络连接,数据库连接等。
2.方法中临时申请的变量,被存放在栈中。栈存储非对象成员的值数据。例如在方法中有B b=new B(); b的值在栈中,new B()的数据在堆中,相当于指针与目标数据的关系。
3.GC工作的主要方式是将不被引用的内存进行释放,然后进行数据移动,从而使得被引用的内存空间总是连接成片的。例如某个对象的位置被移动后,new B()的结果的实例的数据被移动,那么b的值也会变动,从而始终指向new B()结果的实例的位置。
4.强应用就是如b=new B();弱引用的意义是运行被引用的对象被GC释放,比如如果b对new B()是弱引用的,某个时间点new B的结果被释放,那么b的结果就会变成null,具体如何使用现在用不到,不写了。
5.释放非托管资源的方式,可以是析构函数,finallize终结器和实现System.IDisposable接口。但无法确定析构函数何时执行,或者由于多个终结器同时运行会造成性能问题,因此最好使用IDisposable接口。
6.关于C#的指针代码,以后再学。
7.平台调用,即如果用C#调用dll中的api等,用到的时候再学。
泛型
1.从值类型转换为引用类型成为装箱。如果方法需要把一个对象作为参数,同时传递一个值类型,装箱就会自动进行。装箱的值类型可以使用拆箱操作转换为值类型,在拆箱时,需要使用类型强制转换运算符。
2.在JIT编辑器把泛型类编译为本地代码时,会给每个类型创建一个新类。引用类型共享同一个本地类的所有共同的实现代码。这是因为引用类型在实例化的泛型类中只要4个字节的内存地址,就可以引用一个引用类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存的要求都不相同,所以要为每个值类型实例化一个新类。
3.Default用于给泛型指定默认值,where用于对泛型T做出约束,如果某个方法对泛型T有要求,也可以用where的做约束;对于泛型的继承,还可以直接指定类型,如 public class B:A<int>{...},这里直接让泛型的类型为int。
4.协变和抗变,主要和类型转换限制有关,协变<out T>,抗变<in T>。具体的懒得写。
数组和元组
1.数组是引用类型,所以必须给它分配堆上的内存,使用new运算符。
2.锯齿数组,在初始化锯齿数组时,只在第一对方括号中设置该数组包含的行数。定义各行中元素个数的第二个方括号设置为空,因为这类数组的每一行包含不同的元素个数。 例如:int[][] jaged=new int[3][]; jaged[0]=new int[2]; jaged[1]=new int[3]; jaged[2]=new int[1];
3.用方括号声明数组是C#中使用Array类的表示法。也就是本质上是派生自Array类。可以使用Array的静态方法CreateInstance()创建数组。
4.克隆数组用Clone(),排序用Sort()方法。使用自定义的,并且使用排序,那么就必须实现IComparable接口,实现方法CompareTo()。
5.将数组作为参数,数组的协变只能用于引用类型,不能用于值类型。
6.结构ArraySegment<T>可以用来表示数组中的某一段。并且这种表示是引用方式的,即可以修改原来数组中这一段的值。
7.foreach本质使用的是IEnumerator接口的方法和属性来迭代集合中的所有元素。C#2.0添加了yield语句,以便于创建枚举器,yield return返回集合的一个元素,并移动到下一个元素上,yield break可停止迭代。对于yield迭代块即迭代器内部类的使用,以及IEnumerator的使用,参见193。
8.元组:数组合并了相同的类型的对象,二元组合并了不同类型的对象,元组使用参见197。
运算符和类型强制转换
1.特殊运算符:check和uncheck用于判断是否越界,如byte在最大值继续加一可能变成0。is和as参见前面;sizeof用于获得字节大小;typeof用于获取类型,这里大多用于反射。nameof用于返回方法名或者类名等;?可空运算符,如int?a=null,这里主要涉及数据库中int等数据可以为空;??空合并运算符;空传播运算符,如person?.name;如果person为空,那么返回null。
2.基础类型转换:短边长,隐式转换;长变短,显式转换。但是这里短变长并不适用于基类转换为派生类。
3.装箱和拆箱可以把值类型转换为引用类型,并把引用类型转换为数据类型。
4.比较相等性:ReferenceEquas()用于比较两个类是否引用了同一个实例,Equals用于比较值类型,==运算符可以看作中间项。
5.与C++不同,C#不允许重载“=”运算符。
6.自定义索引运算符,即数组的方括号中的索引不一定是int型,可以自定义。这可以用与属性非常相似的语法来实现。如字典Dictionary就是使用非int,具体方式参考228。
7.用户可以实现类之间的隐式转换implicit和显式转换explicit,具体方式参见230。一旦在一个类的内部定义了类型强制转换,就不能在另一个类中定义相同的类型强制转换,否则转换时编译器不知道该选择哪个类型进行转换。
C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)的更多相关文章
- 【读书笔记】C#高级编程 第七章 运算符和类型强制转换
(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 < ...
- Struts2学习(二)———— 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...
- C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换
第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
随机推荐
- redis的数据类型和基本操作
Redis 的Key Redis 的 key 是字符串类型,但是 key 中不能包括边界字符,由于 key 不是 binary safe的字符串,所以像"my key"和" ...
- mysql之InnoDb引擎与MyISAM引擎对比
InnoDb引擎 支持ACID的事务,支持事务的四种隔离级别: 支持行级锁及外键约束:因此可以支持写并发: 不存储总行数: 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制, ...
- 【模板】manachar
马拉车算法用于解决最长回文字串的一类问题,可以将时间复杂度降低为\(O(n)\),几乎达到了理论上的下界. 核心思想:将分奇偶讨论的情况转化成同一种情况(奇数). 下面介绍该算法需要用到的几点性质: ...
- DevExpress ASP.NET v19.1版本亮点:发布全新的Gantt控件
行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Controls v19.1中新增的一些控件及增强的控件功能 ...
- 提取全局应用程序集中的dll
如何提取全局应用程序集中的dll GAC路径:C:\WINDOWS\assembly 在资源管理器中打开这个路径看到的东西不能复制,右键中也只有 “卸载” 和 “属性” 两个菜单. 在命令提示符下切换 ...
- setAttribute()方法和 getAttribute() 方法
一.setAttribute() 方法 setAttribute() 方法为一个或一组元素添加指定的属性,并且为其赋指定的值.(主要针对自定义属性) 如果这个属性已经存在,仅仅设置或是修改属性值. 浏 ...
- ping —— 虚拟机
1. 主机ping 虚拟机 ping 不通 设置——虚拟机—— 防护墙——入站规则—— 文件和打印共享 (回显请求-ICMPv4-In) 2.主机连接不上虚拟机中的sqlsrver 设置— ...
- SpringBoot项目中,WebSocket的使用(观察者设计模式)
1.什么是WebSocket(选择至菜鸟教程(点击跳转),观察者模式) WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和 ...
- 51 Nod 1486 大大走格子
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有一个h行w列的棋盘,里面有一些格子是不 ...
- 16.Python input()函数:获取用户输入的字符串
input() 函数用于向用户生成一条提示,然后获取用户输入的内容.由于 input() 函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input() 函数总是返回一个字符串. 例如 ...