C# 常用修饰符

1.修饰符分类

1.1访问修饰符

public  公开的,公共的,同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。

private  私有的,同一类和结构的代码可以访问该类型和成员。

protected  受保护的,表示可以在当前类的内部以及该类的子类(继承性)中访问

internal  同一程序集中的任何代码都可以访问该类型或成员,但其他程序集不可以访问。

1.2常用修饰符

abstract  指示某个类只能是其他类的基类。

virtual   在派生类中声明其实现可由重写成员更改的方法或访问器。

sealed   指定类不能被继承(密封)。

new  从基类成员隐藏继承的成员。

override  提供从基类继承的虚拟成员的新实现(覆写)。

partial  在整个同一程序集中定义分部类和结构。

event   声明事件

readonly   声明一个字段,该字段只能赋值为该声明的一部分或者在同一个类的构造函数中。

static   声明属于类型本身而不是属于特定对象的成员。

2.不同场景下默认访问修饰符

2.1接口(interface)

接口成员访问修饰符默认为public,且不能显示使用访问修饰符。

2.2类(class)

构造函数默认为public访问修饰符。

析构函数不能显示使用访问修饰符且默认为private访问修饰符。 

类的成员默认访问修饰符为private; 

2.3枚举(enum)

枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。

2.4结构(struct) 

结构成员默认为private修饰符。 

结构成员无法声明为protected成员,因为结构不支持继承。 

2.5嵌套类型

嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。

3.常用修饰符详解

3.1 abstract  (抽象)

 抽象类的用途提供一个可供多个派生类共享的通用基类定义。(与sealed作用相反)

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。

接口和抽象类最本质的区别:抽象类是一个不完全的类,是对对象的抽象,而接口是一种行为规范。

如果希望禁止通过 new关键字直接进行实例化,可以将类声明为abstract 如果这样做,则仅当从该类派生新类时才能使用该类

 抽象类不必包含抽象成员;但是,如果某个类确实包含抽象成员,则该类自身必须声明为抽象类。

abstract 修饰符可用于类、方法、属性、索引器和事件

在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类

标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

3.2 virtual (虚方法)

virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。 例如,此方法可被任何继承它的类重写。

virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
  情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
  情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName name= new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。

这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。

virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用

3.3 static(静态方法)

当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。

也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用。

3.4 sealed(密封)

在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。
sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。

C#还提出了密封方法(sealed method) 的概念,

以防止在方法所在类的派生类中对该方法的重载

对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。

不是类的每个成员方法都可以作为密封方法密封方法,要作为密封方法必须对基类的虚(virtual)方法进行重载,提供具体的实现方法。所以,在方法或属性的声明中,sealed 修饰符总是和override 修饰符同时使用

这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性

由于结构是隐式密封的,因此它们不能被继承。

using System ;
class A
{
    public virtual void F( )
    { 
            Console.WriteLine("A.F") ; 
        }
    
        public virtual void G( )
    {     
            Console.WriteLine("A.G") ; 
        }
}
class B: A
{
    sealed override public void F( )
    { 
            Console.WriteLine("B.F") ; 
         }

        override public void G( )
    {
             Console.WriteLine("B.G") ; }
    }

    class C: B
{
    override public void G( )
    { 
            Console.WriteLine("C.G") ; 
     }
}

写此博文仅供学习,欢迎大家指正。

原文地址:https://www.cnblogs.com/MirZhai/p/9376071.html