C#访问修改符

修饰符能够指定访问的可见性,还能够指定其本质。(文章摘自《C#高级编程(第9版)》以及Microsoft编程

1. 可见性修饰符服务器

    public:应用于全部类型或成员,即任何代码都可以访问该项——公有访问,不受任何限制ide

    protected:应用于类型和内嵌类型的全部成员,即只有派生的类型能访问该项——保护访问,只限于本类和子类访问函数

    internal:应用于全部类型或成员,即只能在包含它的程序集中访问该项——内部访问。只限于本程序集内访问。不带修饰符的类是默认internalui

    private:应用于类型和内嵌类型的全部成员,即只能在它所属的类型中访问该项——私有访问。只限于本类成员访问spa

    protected internal:应用于类型和内嵌类型的全部成员,即只能在包含它的程序集和派生类型的任何代码中访问该项——内部保护访问。只限于本程序集内和子类访问。code

    注:protected、private、protected internal不能用来定义类,只能应用于成员。可是可用于定义嵌套类,嵌套的内部类能够访问外部类全部成员,包括私有成员。blog

1 public class OuterClass   //不能使用protected、private、protected internal
2 {
3         protected class InnerClass  //能够使用protected、private、protected internal,能够访问OuterClass全部成员,其为OuterClass成员之一
4          {
5                 // etc.
6          }
7          // etc.
8 }

 

2. 其余修饰符继承

    new:应用于函数成员,即成员用相同的签名隐藏继承的成员—— new 修饰符会用一样的名称建立一个新成员并使原始成员变为隐藏。override 修饰符会扩展继承成员的实现。对同一成员同时使用 new  和 override 是错误的作法。详见https://msdn.microsoft.com/zh-cn/435f1dw2(VS.80).aspx
事件

    static:应用于全部成员,即成员不做用于类的具体实例——存储在全局数据区,不占用类的空间大小。

    virtual:仅应用于函数成员,即成员能够由派生类重写——该修饰符修饰的函数能够做为正常的函数使用,也能够在派生类中用override进行重写

    abstract:仅应用于函数成员,即虚拟成员定义了成员的签名,但没有提供实际代码——该修饰符修饰的函数不能做为正常的函数使用,必须在派生类中用override进行重写

    override:仅应用于函数成员,即成员重写了继承的虚拟或抽象成员

    sealed:应用于类、方法和属性,即对于类,不能继承自密封类。对于属性和方法,成员重写已继承的虚拟成员,但任何派生类中的任何成员都不能重写该成员。该修饰符必须与override一块儿使用。——禁止继承

    extern:仅用于静态DllImport方法,即成员在外部用另外一种语言实现。——用于声明在外部实现的方法,此时方法还需声明为static;不能与abstract一块儿使用

    const: 用于声明某个常量字段或常量局部变量,即指定域或局部变量的值不能被改动。

    event:用于声明发布服务器类中的事件

    readonly:可应用于字段,即只能在声明时以及相同类的内部被赋值。

    注:

  • abstract、sealed做为类修饰符

          abstract:以指示某个类只能做为其余类的基类。

          sealed:以指示某个类不能被继承。

  • virtual和abstract区别
 1 class MyBaseClass
 2 {
 3     // virtual auto-implemented property. Overrides can only
 4     // provide specialized behavior if they implement get and set accessors.
 5     public virtual string Name { get; set; }
 6 
 7     // ordinary virtual property with backing field
 8     private int num;
 9     public virtual int Number
10     {
11         get { return num; }
12         set { num = value; }
13     }
14 }
15 
16 
17 class MyDerivedClass : MyBaseClass
18 {
19     private string name;
20 
21    // Override auto-implemented property with ordinary property
22    // to provide specialized accessor behavior.
23     public override string Name
24     {
25         get
26         {
27             return name;
28         }
29         set
30         {
31             if (value != String.Empty)
32             {
33                 name = value;
34             }
35             else
36             {
37                 name = "Unknown";
38             }
39         }
40     }
41 
42 }
virtual例子
 1 abstract class ShapesClass
 2 {
 3     abstract public int Area();
 4 }
 5 class Square : ShapesClass
 6 {
 7     int side = 0;
 8 
 9     public Square(int n)
10     {
11         side = n;
12     }
13     // Area method is required to avoid
14     // a compile-time error.
15     public override int Area()
16     {
17         return side * side;
18     }
19 
20     static void Main() 
21     {
22         Square sq = new Square(12);
23         Console.WriteLine("Area of the square = {0}", sq.Area());
24     }
25 
26     interface I
27     {
28         void M();
29     }
30     abstract class C : I
31     {
32         public abstract void M();
33     }
34 
35 }
36 // Output: Area of the square = 144
abstract例子
相关文章
相关标签/搜索