zoukankan      html  css  js  c++  java
  • [.net 面向对象编程基础] (7) 基础中的基础——修饰符

    本文转自:https://www.cnblogs.com/yubinfeng/p/4550628.html

        在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改符。

       首先 修饰符是什么?

        修饰符用于限定类型以及类型成员的申明

        从定义可以看出按功能分为两类:访问修饰符和声明修饰符

    1.访问修饰符 (5个)

    访问修饰符

    说明

    public

    公有访问。不受任何限制。

    private

    私有访问。只限于本类成员访问,子类,实例都不能访问。

    protected

    保护访问。只限于本类和子类访问,实例不能访问。

    internal

    内部访问。只限于本项目内访问,其他不能访问。

    protected internal

    内部保护访问。只限于本项目或是子类访问,其他不能访问

        C#成员类型的可修饰及默认修饰符如下表:

    成员类型

    默认修饰符

    可被修饰符

    enum

    public

    none

    class

    private

    public、protected、internal、private、 
    protected internal

    interface

    public

    none

    struct

    private

    public、internal、private

    2.声明修饰符 (10个)

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

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

    Abstract:抽象类,只能是其他类的基类。类中的方法只声明不实现,方法的实现在他的派生类中完成。

    Sealed:指定类不能被继承。

    Virtual:用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象

    Override:提供从基类继承的成员的新实现

    New:作修饰符,隐藏从基类成员继承的成员,在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。作运算符,用于创建对象和调用构造函数。

    Extern:用于声明在外部实现的方法。 extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 特性一起使用。 在这种情况下,还必须将方法声明为 static

    Readonly:修饰字段,表示该字段为只读字段。

    注意:readonly修饰引用类型时由于操作不当可能修改该只读对象状态。例如:Readonly List< Person> persons=….;

    我们可能在某些地方对persons 进行了修改:persons.add(new Person());

    Const:修饰字段,表示该字段为只读字段。并且在编译时必须能够明确知道该字段的值,其值是硬编码到程序中去的,修改了该类型成员后需要重新编译才能使修改生效。

    而readonly是运行时只读,内容在运行时确定,所以修改了readonly类型成员后无需重新编译即可生效。 

    Readonly不能修饰局部变量,const可以。

    要点:

      Virtual,override和new 的区别

    virtual  用于父类中,声明某方法可以重写,该方法不能是static;

    override(覆盖继承) 用于子类中,重写父类中用virtual/override/abstract关键字声明的方法;

    new(隐藏继承)  用于子类中,可修饰父类中有或无virtual声明的方法;

      如果在父类中有与父类同名同参的方法时,C#会隐式在子类前添加一个new关键字。 

    【区别】override与new

      当将一个子类实例赋值给父类实例,在子类实例与父类实例中分别调用该方法时:使用override修饰的都将调用子类方法,而使用new修饰的会分别调用子类方法和父类方法。

      New和Override这两个关键字是互斥的。不可以同时使用。  

    【区别】virtual与abstract

      virtual:用于父类中声明该方法可被重写。

      abstract:只能用在抽象类中声明抽象方法,本身不能实现任何功能(因此必须在子类中override),不能实例化。

      两者除了在子类中同样可以用override重写这个相同点之外,没有其他关系。 

  • 相关阅读:
    Hadoop之HDFS中HA的搭建
    HBase详细介绍
    HBase简介
    MapReduce工作原理介绍
    springMVC中的form:标签使用
    自定义fns
    db2数据建邦联-相当于Oracle数据库的dblink
    Oracle和db2数据库基础操作
    Linux学习之添加用户
    AMPQ 0-9-1学习笔记
  • 原文地址:https://www.cnblogs.com/hanguoshun/p/12728336.html
Copyright © 2011-2022 走看看