C#关键字--修饰符

来源:互联网 发布:淘宝老客户维护 编辑:程序博客网 时间:2024/06/05 10:25
  1. 访问修饰符:public、protected、private、internal
    用于指定声明的成员或类型的可访问性。
    public:不受限
    protected:仅限于包含类或包含类派生的子类
    internal:当前程序集
    protected internal:internal 或 protected ,两者求并集
    private:当前包含类型


  2. abstract
    指示被修改内容的实现已丢失或不完整。
    可用于修饰类、方法、属性、索引和事件。

    • 抽象类
      抽象类不能实例化
      包含0个或1个以上抽象方法和访问器(属性) ,抽象类中不一定有抽象方法或抽象访问权(属性)
      不能用sealed修饰,sealed和abstract具有相反的含义。sealed类不能被继承,abstract类要求被继承
    • 抽象方法和抽象属性
      指示方法或属性不包含实现
      抽象方法是隐式的虚方法
      只有抽象类中才有抽象方法声明
      通过override在派生类中重写替代抽象方法或属性
      抽象类必须为所有实现的接口提供实现,可将接口映射到抽象方法上,例如:
       
      interface I
      {
      void M();
      }
      abstract class C : I
      {
      public abstract void M();
      }
  3. sealed
    断子绝孙符
    修饰类时,类不可以被继承
    修饰方法/属性时,子类不能替代此方法或属性


  4. virtual
    用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写
    虚成员的实现可由派生类中的替代成员更改
    虚方法就是有默认实现的抽象方法
    在修饰方法时override和new的区别:
    override只能重写virtual、abstract、override修饰的方法
    new是隐藏,可通过类型转换调用到基类的方法。
    override是重写,无论是派生类还是基类都会找到派生类方法。
    new可以隐藏基类中的普通方法,也可以隐藏基类中的虚方法。
    new可以修改方法可访问性,而override不可以。

public class A    {        public void method1()        {            Console.WriteLine("this is A method1");        }        public virtual void method2()        {            Console.WriteLine("this is A method2");        }        public void method3()        {            Console.WriteLine("this is A method3");        }        public virtual void method4()        {            Console.WriteLine("this is A method4");        }    }    public class B : A    {        public void method1()        {            Console.WriteLine("this is B method1");        }        public override void method2()        {            Console.WriteLine("this is B method2");        }        public new void method3()        {            Console.WriteLine("this is B method3");        }        //private virtual 错误        //private virtual void method4()        //{        //  Console.WriteLine("this is A method4");        //}        //private override 错误        //private override void method4()        //{        //  Console.WriteLine("this is A method4");        //}        //private new 正确        private new void method4()        {            Console.WriteLine("this is A method4");        }    }        public static void main()        {            A a1 = new A();            A a2 = new B();            B a3 = new B();            Console.WriteLine("A A*******************");            a1.method1();            a1.method2();            a1.method3();            Console.WriteLine("A B*******************");            a2.method1();            a2.method2();            a2.method3();            Console.WriteLine("B B*******************");            a3.method1();            a3.method2();            a3.method3();            Console.WriteLine("(A) A B*******************");            ((A)a2).method1();            ((A)a2).method2();            ((A)a2).method3();            Console.WriteLine("(A) B B*******************");            ((A)a3).method1();            ((A)a3).method2();            ((A)a3).method3();        }

输出结果:
这里写图片描述

A A*******************
this is A method1
this is A method2
this is A method3
A B*******************
this is A method1
this is B method2
this is A method3
B B*******************
this is B method1
this is B method2
this is B method3
(A) A B*******************
this is A method1
this is B method2
this is A method3
(A) B B*******************
this is A method1
this is B method2
this is A method3



abstract、virtual、override、new

abstract和virtual都是用于修饰基类方法
virtual有默认实现,abstract无实现
abstract方法一定是在抽象类中出现,virtual不一定
override用于重写abstract、virtual和override修饰的方法
new用于隐藏基类中的普通方法或override修饰的方法
new可修改方法的可访问性,override不可以
new隐藏的方法可通过对象类型转换进行调用,override对象类型转换后调用的还是派生类的方法