博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 修饰符
阅读量:5025 次
发布时间:2019-06-12

本文共 2263 字,大约阅读时间需要 7 分钟。

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  (抽象方法)

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

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

3.2 virtual (虚方法)

virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:

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

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

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

3.3 static(静态方法)

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

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

3.4 sealed(密封)

在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。

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

C#还提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载。对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。

不是类的每个成员方法都可以作为密封方法密封方法,要作为密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,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

你可能感兴趣的文章
版本更新
查看>>
SQL 单引号转义
查看>>
start
查看>>
实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端
查看>>
PHP socket客户端长连接
查看>>
7、shell函数
查看>>
【转】Apache Jmeter发送post请求
查看>>
Nginx 基本 安装..
查看>>
【凸优化】保留凸性的几个方式(交集、仿射变换、投影、线性分式变换)
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
TFS --- GrantBackup Plan Permissions Error
查看>>
傅里叶级数与积分方程
查看>>
软工作业3:用户体验分析——以“南通大学教务管理系统微信公众号”为例
查看>>
Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
查看>>
我们前端跟后端是怎么合作的
查看>>
mysql存储过程
查看>>
洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]
查看>>
letecode [136] - Single Number
查看>>
linux下设置固定IP的方法
查看>>
VMware虚拟机下Linux系统的全屏显示
查看>>