托管和非托管资源

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#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)的更多相关文章

  1. 【读书笔记】C#高级编程 第七章 运算符和类型强制转换

    (一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 < ...

  2. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  3. C#高级编程笔记 2016年10月8日运算符和类型强制转换

    1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...

  4. C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换

    第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...

  5. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  7. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

随机推荐

  1. 【51nod1672】区间交

    题目大意:给定一个长度为 N 的序列,以及 M 个区间,现从中选出 K 个区间,使得这些区间的交集区间的点权和最大,求最大值是多少. 题解: 发现直接选 K 个区间不可做,考虑从答案入手.设答案区间为 ...

  2. 通过实现接口runnable实现多线程

    实现Runnable接口实现多线程的步骤(1)编写类实现Runnable接口(2)实现run(方法(3)通过Thread类的start(方法启动线程 静态代理模式Thread >代理 角色MyR ...

  3. 说一说你对HTML5语义化的理解

    本题地址:https://github.com/YvetteLau/Step-By-Step/issues/8 语义化意味着顾名思义,HTML5的语义化指的是合理使用语义化的标签来创建页面结构,如he ...

  4. Django框架简介(1)

    目录 手写web框架 基于wsgiref模块写web服务端框架 python三大主流框架 django框架介绍 注意事项 django下载方法 django项目及app的创建 命令行创建项目 pych ...

  5. SAP Diagnostics Agent无法启动

    [问题]SAP Diagnostics Agent无法启动. [现象]Diagnostics Agent安装并没有发生错误,但是打开SAPMMC,Diagnostics Agent(DAA)的Inst ...

  6. EasyUI DataGrid undefined处理

    处理undefined var val = null; console.log(val); console.log(val || ""); val = undefined; con ...

  7. poj 2566 Bound Found 尺取法 变形

    Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2277   Accepted: 703   Spec ...

  8. 彩色图像--色彩空间 CIELAB、CIELUV

    学习DIP第65天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://gi ...

  9. week5 作业

    week5 作业 1.描述GPT是什么,应该怎么使用? 描述GPT之前要简单了解MBR分区,MBR(Main Boot Record)叫做主引导记录,其位于磁盘的最前端,由一段代码组成,共占用512个 ...

  10. A. Even Substrings

    A. Even Substrings time limit per test 0.5 seconds memory limit per test 256 megabytes input standar ...