一、C#中的值类型和引用类型
      C#的应用类型大体有下面几种:
     类、数组、接口、委托,当然还有其他的,比如字符串
    值类型和引用类型的区别:值类型在线程的栈上分配存储空间,引用类型的变量在堆上分配内存存储该变量的内容,然后在栈上分配一个单元存放该内容在堆上的首地址。也就是说,引用类型的变量实际上是“指”向了他所代表的内容所在的地址。
二、装箱与拆箱
    装箱:将值类型转换为引用类型
    拆箱:将引用类型转换为值类型
    将引用类型转换为值类型,即拆箱需要显示转换。
    尽量避免不必要装箱和拆箱(这一点需要仔细分析代码,弄清值和引用的区别,慢慢体会)
三、类与结构的区别
    类是引用类型的,结构是值类型的,因此结构不必进行实例化;
    结构不能定义无参数的构造器;
四、ref和out
    这两个关键字都表示引用传参,但是out要求参数在函数中必须改变
五、重载overload
    方法的重载:参数列表一定要不同,如果参数表相同,只是返回值不同,或方法的修饰符不同
    不能是合法的重载;
    对于参数列表,ref和out关键字修饰的参数类型将被编译器认为是相同的 。
   构造器的重载:如果写了有参数的构造器,编译器将不再提供无参的构造函数。因此提供了非默认的构造器就不能
   在不传参的情况下进行实例化,原因是
    constructor(string str)在编译时被解释成constructor(string str):this()
六、可变的方法参数
    如果在运行之前无法预料要传递给方法的参数的个数,可以使用可变的方法参数:
    例如可以这样处理:
    displayperson(params person[] p)
    其中,params关键字指出p是可变的。所谓的可变意思是在传给方法的时候不知道有几个person,仅此而已,不要误解。
七、重写override
     重写的函数的访问级别必须与虚函数一致,而且虚函数不能声明为private
     new和virtual可以同时使用,实际上子类方法与父类同名时,子类函数默认是有new关键字。
  八、静态方法
    静态方法只能访问类的静态成员,不能访问实例成员但是非静态方法可以访问静态成员;
    可以提供静态的构造器,但只能提供一个,并且在静态构造器中不能访问实例成员,包括this指针,在创建类的实例时
静态构造器将先执行。静态构造器不允许有public等修饰符。