yekun

导航

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.

posted on 2016-10-18 16:53  yekun  阅读(88)  评论(0)    收藏  举报