修饰符

65 阅读4分钟

修饰符,用来类型或者成员的关键字。修饰符可以指定方法的可见性。

  1. public:同一程序集(DLL或EXE)中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
  2. private:只有同一类或结构中的代码可以访问该类型或成员。
  3. protected:只有同一类或结构或者此类的派生类中的代码可以访问该类型或成员。
  4. internal:同一程序集中的任何代码都可以访问该类型或成员,但其他程序集的代码不可以。
  5. protected internal:在一程序集中,protected internal体现的是internal的性质;在其他程序集中,protected internal体现的是protected的性质。

public和private修饰字段和方法的时候,表示该字段或者方法能不能通过对象去访问,只有public的才可以通过对象访问,private(私有的)只能在类模板内部访问。
protected保护的,当没有继承的时候,它的作用和private是一样的,当有继承的时候,protected:表示可以被子类访问的字段或者方法

类的修饰符
ppublic class…
class ..
前者可以在别的项目下访问,后者不行

怎么访问到别的项目的类

把09项目的父类和子类都设置public,才可以在10项目访问到子类,不能只把子类设置为public,因为这样子类的访问权限高于父类,会造成父类方法泄露,比如我直接继承子类,然后调用父类的方法

namespace _09_抽象类
{
    public class Base
    {
        public virtual void Move()
        {

        }

    }
}

namespace _09_抽象类
{
    public class Child:Base 
    {
        public sealed override void Move()
        {
            Console.WriteLine("不能继续重写了");
        }
    }
}

在10项目中,调用09项目的Child类创建对象


using _09_抽象类;
namespace _10_子类的构造函数
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
        }
    }
}

总结

  1. 添加别的项目的引用
  2. 引入命名空间
  3. 把调用的类访问权限设置为public,也把父类设置为public

new

隐藏继承的成员

abstract

  1. 使用abstract修饰的类为抽象类,抽象类只能是其他类的基类,不能与sealed、static一起使
  2. abstract可以修饰抽象类中的方法或属性,此时,方法或属性不能包含实现,且访问级别不能为私有,因为我们希望子类实现抽象类和抽象方法
  3. 抽象类不能被实例化。

sealed

  1. 使用sealed修饰的类为密封类,密封类无法被继承,不能和abstract、static一起使用。
  2. 当sealed用于方法或属性时,必须始终与override一起使用。

static

  1. 使用static修饰的类为静态类,静态类所有成员都必须是静态的,不能与abstract、sealed一起使用。
  2. static可以修饰方法、字段、属性或事件,始终通过类名而不是实例名称访问静态成员
  3. 静态字段只有一个副本
  4. 静态类不能被实例化。
internal class Test
{
    public int hp;
    public static int count;

    public static void Move()
    {
        Console.WriteLine(count);
        
    }
}
internal class Program
{
    static void Main(string[] args)
    {
        Test t1 = new Test();
        t1.hp = 100;
        Test t2 = new Test();
        t2.hp = 200;

        Test.count = 1;
        Test.count = 2;
        Console.WriteLine(Test.count);

        
    }
}
  1. 静态类只能包括静态函数、静态数据成员,不需要实例化
  2. 静态函数只能使用静态数据成员
  3. 调用静态的函数和数据成员都要通过类名调用,不能通过对象

const

  1. 使用const关键字来声明某个常量字段或常量局部变量,必须在声明常量时赋初值
  2. 不能与static-一起使用,常量默认是static的
  3. 常量字段只有一个副 本

readonly

  1. 使用readonly关键字来声明只读字段。
  2. 只读字段可以在声明或构造函数中初始化,每个类或结构的实例都有一个独立的副本。
  3. 可以与static一起使用,声明静态只读字段,静态只读字段可以在声明或静态构造函数中初始化,静态常量字段只有一个副本。
internal class Base
{
    private readonly int hp = 100;

    public Base(int hp)
    {
        this.hp = hp;
    }
}