C#修饰符讲解大全
1.修饰符是什么?
修饰符是用于限定类型以及类型成员的声明的一种符号。【百度百科】
2.修饰符分类
13种修饰符,按功能可分为三类:访问修饰符,类修饰符和成员修饰符.【百度百科】
作 用:限定类型以及类型成员
c#中的修饰符被用来定义类型和成员方法,.net3.5共有下面十三种:
修饰符 |
说明 |
abstract |
指定某个类为抽象类。 |
const |
指定无法修改字段或局部变量的值,即被修饰为常量。 |
event |
声明事件。 |
extern |
指示某个方法在外部实现,一般在.net程序调用外部win32api时使用。 |
new |
隐藏从基类成员继承的成员。 |
override |
重写从基类成员继承的成员。 |
partial |
在整个同一程序集中定义分部类和结构。可以简单理解为把同一个类分别写在不同的.cs文件中。 |
readonly |
声明一个字段或是变量为只读,且只能在声明或是构造函数时给此字段、变量赋值。 |
sealed |
指定被修饰的类无法被其它类继承。 |
static |
指定一个静态字段、变量、类、方法。 |
unsafe |
指定一段不安全代码,即在c#中使用指针。 |
virtual |
修饰某个方法为虚方法,以便在其继承类中可重写此方法。一般与override和new搭配使用。 |
volatile |
指示字段可由操作系统、硬件或并发执行线程等在程序中进行修改。volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。 |
3.详解修饰符
(1)访问修饰符:
①访问修饰符就是类,属性和方法的定义分级制度 。
②4个访问修饰符(是添加到类、结构或成员声明的关键字)
public:公有的,是类型和类型成员的访问修饰符。对其访问没有限制。
internal:内部的,是类型和类型成员的访问修饰符。同一个程序集中的所有类都可以访问
private:私有的,是一个成员访问修饰符。只有在声明它们的类和结构中才可以访问。
protected::受保护的,是一个成员访问修饰符。只能在它的类和它的派生类中访问。
protected internal:访问级别为 internal 或 protected。即,“同一个程序集中的所有类,以及所有程序集中的子类都可以访问
一个成员或类型只能有一个访问修饰符,使用 protected internal组合时除外。
(2)类修饰符:
abstract:可以被指示一个类只能作为其它类的基类.
sealed:指示一个类不能被继承.
static:修饰类时表示该类是静态类,不能够实例化该类的对象,该类的成员为静态.
(3)成员修饰符
abstract:指示该方法或属性没有实现.
const:指定域或局部变量的值不能被改动.
event:声明一个事件.
extern:指示方法在外部实现.
override:对由基类继承成员的新实现.
readonly:指示一个域只能在声明时以及相同类的内部被赋值.
partial:在整个同一程序集中定义分部类和结构
virtual:用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象
new:作修饰符,隐藏从基类成员继承的成员,在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。作运算符,用于创建对象和调用构造函数。
4.c#中方法、类等的默认访问修饰符
接口(interface)
接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
类(class)
构造函数默认为public访问修饰符。
析构函数不能显示使用访问修饰符且默认为private访问修饰符。
类的成员默认访问修饰符为private;
枚举(enum)
枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
结构(struct)
结构成员默认为private修饰符。
结构成员无法声明为protected成员,因为结构不支持继承。
嵌套类型
嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致
5.virtual,override和new 的区别
①. virtual和override配套使用。在基类base中声明了虚方法method()并用virtual修饰,在子类derived中重写方法method()并用override修饰。那么当将子类的实例赋予基类的对象(不需要强制转换)时即basebclass= new derived();bclass.method()是调用了子类的method()方法,而不是基类的。
②.new不需要和virtual配套使用。在基类base中声明了方法method(),在子类derived中声明了同名的方法method()并用new修饰。那么当将子类的实例赋予基类的对象时即basebclass= new derived();bclass.method()是调用了基类类的method()方法,而不是子类的。
③.这说明,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.
*注意:
(1)程序集:经由编译器编译得到的,供clr进一步编译执行的那个中间产物,在windows系统中,它一般表现为·dll或者是·exe的格式,但是要注意,它们跟普通意义上的win32可执行程序是完全不同的东西,程序集必须依靠clr才能顺利执行。【百度百科】
被编译到同一个dll或exe中的程序就是处于同一个程序集中,在不同的dll或exe文件中的程序就是处于不同的程序集中。
net中的程序集就是一个编译器直接生成的dll或可执行的exe文件,包含程序集清单、元数据和msil等。是一个或者多个类型定义及资源文件的集合体。
程序集(.net中exe与dll的区别就是exe有程序接入口,即main函数)就是.net框架下,可以被clr加载并运行的一堆数据集(类似java中的jar包,无法脱离虚拟机自己运行)。它们和之前 c\c++生成的可执行程序和动态链接库有本质的区别。作为一堆数据集,程序集的数据可以分为:类型元数据,程序元数据,il代码,资源。
(2)元数据:元数据一般就是指描述自身的数据。
(3)程序集元数据:包含程序集的版本信息,安全信息,签名等。
(4)类型元数据:记录了程序集将引用了哪些类,用户自定义了哪些类,字段,数据类型等一系列信息(vs的编程助手靠的就是反射获取类型元数据)。
(5)il代码:msil,微软中间语言,微软跨语言的根基所在,所有的c#代码都编译成il代码,保存在程序集中,在被clr加载后,由jit调用bcl,ftl即时编译成机器码来让cpu运行。
*:以上为博主查阅大量资料总结得来,也是方便自己了解这块知识。如需转载,请标注来源,尊重劳动成果,谢谢!
下一篇: 我坚定信念的源泉