C#深入学习笔记
个人认为C#深入掌握应从:CLR(初始化器与内存分配机制)、面向对象思想入手:
一、数据类型
值类型:数值类型、bool、枚举、结构
引用类型:string、数组、对象、类、接口
string:内存分配与驻留池string.Intern(),学习参考 http://www.cnblogs.com/instance/archive/2011/05/24/2056091.html;
值不可改变;两种创建方式:赋值“=”和string对象;
比较:“==” 和 equal() ,“==”引用类型比较的是引用的地址,string重新object的equal方法为值比较,string的“==”也做了处理,比较的是值;
eg:
string a = new StringBuilder("hello").ToString(); string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); //string b = "hello"; Console.WriteLine(a == b); Console.WriteLine((object)a==(object)b);
结果:true; false
二、初始化器
类的实例化,初始化执行顺序,参考:http://www.cnblogs.com/instance/archive/2011/05/27/2059409.html
★这种初始化顺序是由内存分配机制决定的,如我们调用MyClass myClass = new MyClass(), 其产生对象如下:
1. 计算该类中定义的所有实例字段的size和两个附加对象(type handler(类对象的指针)和syncBlockIndex(指向一块用来管理对象同步的内存))的size并一直递归到object对象,得到其需要分配内存大小, 看剩余内存是否够分配此对象, 不够会导致垃圾回收.
2. 首先构造MyClass的type对象,type对象包括静态字段和方法表,将其分配在托管堆的loader堆上,注意此对象将不会被GC自动回收, 其生命周期是从创建到AppDomain卸载.
3. 构造MyClass的实例字段,构造附加type handler并指向type对象, 构造SyncBlockIndex并指向同步内存.
4. 调用MyClass构造函数,此时会引起其父类初始化, 父类初始化循环上述过程,直至object对象完成创建, 再返回执行子类构造函数直至MyClass, 创建MyClass完成后, 返回其内存地址, 赋值给MyClass的this,并将其引用传给栈上声明的myClass.
浙公网安备 33010602011771号