一、值参数和引用参数
  与C++类似,C#中也有值参数与引用参数传递的区别。
  值参数传递:传递给被调用方法的是参数的副本,此时在方法内对参数副本作的修改,并不会影响原来实参数据本身;
  引用参数传递:传递给被调用方法的是该参数引用的副本,此时在方法内对参数引用副本作的修改,都会反映到原始数据,即原始实参也会被修改。
  值得注意的是,传递引用也可以有两种方式:通过值传递引用和通过引用传递引用。通过值传递引用就是传递了引用的副本,而通过引用传递引用实际上就是传递原来的引用。因此,在这两种情况下,如果为引用参数赋新值,会有微妙的区别。
    class myclass
    {
        public int val;
    }
    class test
    {
        public void change(ref myclass mc1, myclass mc2)
        {
            mc1 = new myclass();
            mc1.val = 999;
            //mc2 = new myclass();
            mc2.val = 999;
        }
    }
   class Program
    {
        static void Main(string[] args)
        {
            test tc = new test();
            myclass m1 = new myclass();
            m1.val = 1;
            myclass m2 = new myclass();
            m2.val = 1;
            tc.change(ref m1, m2);
            Console.WriteLine("m1.val={0},m2.val={1}", m1.val, m2.val);
        }
    }
  如上代码,如果类test中的注释行被注释掉,则输出为:999,999
  如果注释行的代码不被注释而起作用,那么输出为:999,1
  原因就是mc2是通过值传递的引用。
二、ref和out
  ref和out关键字都是指明参数是引用类型的,其区别是:
  使用ref,则参数必须在使用前初始化,而在方法内被声明为ref的参数可以被修改,也可以不被修改;
  使用out,则参数在使用前可以不初始化,但是在方法内部(方法返回之前)必须对声明为out的参数赋值。当参数是引用类型时(比如对象),这种“赋值”不是指某些字段、属性赋值,而是对对象赋值。
三、方法重载
  重载的最低要求是参数列表不同(包括参数次序不同),而返回类型、访问修饰符不同都不是重载。
  使用ref或out来区分的,视为重载,但是不能同时使用二者:
  public void read(string s)
  {
 Console.WriteLine(s);
  }
  //Either of following two is ok,but not both
  public void read(ref string s)
  {
 Console.WriteLine(s);
  }
  public void read(out string s)
  {
 Console.WriteLine(s);
  }
 四、重载构造函数
  一旦重载了构造函数,编译器将不再提供默认构造函数,可以自己定义一个无参数的构造函数。
五、继承与重载
  当联合使用继承和重载时,C#的做法类似于java,而不是C++。C++的重载概念仅限于同一个类中的方法,而C#中派生类和基类的方法仍然被认为是继承。
六、方法隐藏
  类似于C++,如果在基类声明一个方法,派生类中重写该方法并使用new关键字,则隐藏基类方法。(new是默认的,可省略。)
    class Employee
    {
        public void Calpay()
        {
            Console.WriteLine("Employee.Calpay");
        }
    }
    class SalariedEmployee:Employee
    {
        new public void Calpay()
        {
            Console.WriteLine("SalariedEmployee.Calpay");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Employee e = new Employee();
            e.Calpay();
            SalariedEmployee se = new SalariedEmployee();
            se.Calpay();
        }
    }
  输出为:Employee.Calpay
   SalariedEmployee.Calpay
 
七、多态、覆盖
   与C++类似,基类方法声明时间关键字virtual,派生类想要覆盖则在声明时加关键字override。
   覆盖的、重定义的方法的方分级别必须与它重定义的虚函数级别一致(不低于),虚函数不能声明为private。
   new和virtual可以同时使用,不过此时是为这个虚函数建立了一个新的级别。
   如果从构造函数调用虚函数,C#类似于java,而不是C++,调用最早派生的重定义的方法。(此时派生类的对象有可能还没有完全构造好。)
八、静态方法
  与C++类似,使用static关键字。
  静态方法可以访问类中所有静态成员,但不能访问普通实例成员。反过来,非静态方法都可以访问静态成员和非静态成员。
  构造函数中不能通过this访问静态成员。
  C#的静态方法只能通过 “类名.方法” 的形式访问。
九、静态构造函数
  可以声明静态构造函数:不能有参数,不能有访问修饰符,只能访问静态成员。将先调用静态构造函数,再调用非静态。不构造对象,直接调用静态方法或成员也会触发调用静态构造函数。