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

本文共 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

你可能感兴趣的文章
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
6-1 并行程序模拟 uva210
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>