zoukankan      html  css  js  c++  java
  • C#访问修改符

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

    1. 可见性修饰符

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

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

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

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

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

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

    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例子
  • 相关阅读:
    Windows性能调优: Perfomn.exe 和Perfmon /res
    WPF:逻辑树和视觉树
    AD FS 概述
    SQL Server : TRUSTWORTHY 数据库属性
    WCF:在开发期间应该注意的问题
    ASP.NET MVC 2中的数据验证
    SQL Server:如何在Service Broker发送消息验证失败后获取源消息
    GDI+:自定义控件时如何使用Region来输出特定区域
    LINQ to XML:如何替换XCData的内容
    javascript是否真的就不能实现跨站请求呢?
  • 原文地址:https://www.cnblogs.com/zhangjbravo/p/9110642.html
Copyright © 2011-2022 走看看