欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#修饰符讲解大全

程序员文章站 2022-12-24 16:27:32
1.修饰符是什么? 修饰符是用于限定类型以及类型成员的声明的一种符号。【百度百科】 2.修饰符分类 13种修饰符,按功能可分为三类:访问修饰符,类修饰符和成员修饰符.【百度百科】 作 用:限定类型以及类型成员 C#中的修饰符被用来定义类型和成员方法,.Net3.5共有下面十三种: 修饰符 说明 ab ......

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运行。

 

*:以上为博主查阅大量资料总结得来,也是方便自己了解这块知识。如需转载,请标注来源,尊重劳动成果,谢谢!