const、readonly、static相关

const  常量
  定义其值不可改变的变量。常量只能在类中声明时初始化,即每个常量的值都是在编译时已知的。编译过后,这些const被硬编码到程序集中。C#中const关键字不能被用来限定参数或返回值。可以用来创建局部或实例一级的数据。
  常量数据在定义时隐含为静态定义。所以要引用一个被外部类型定义的常量,必须以定义它的类型的名字开头。

readonly 只读
  创建一个在运行之前不知道初始值而且不可改变的字段。只读字段允许建立在编译时不知道值的数据,但是一旦建立,就永远不会被改变。
  若只读字段的值需要从外部传入,则只能在类的构造函数中对其赋值。且必须在至少一个构造函数结束之前分配对象来将其初始化。否则编译器不会提示任何信息,但该字段将变得彻底无用,因为它始终保持为null。
  与常量数据不同,只读字段并不隐含为静态的。有需要可使用static关键字。

static 静态
  对于静态成员,必须直接通过类级别来调用,即“类名.静态成员名”,而不能通过该类的实例调用。对于静态类和静态方法,须遵循静态成员只能操作其他静态成员的规则。
  • 静态字段、属性和事件
  1、它们不依赖对象的实例而存在,包括没有创建任何实例的情况
  2、它们被类的所有实例共享(比如:当类定义的非静态的数据时,这个类型的每一个对象都保存着字段的一份私有副本。而静态数据只分配一次,并在所有同类型的对象实例之间共享。)
  3、它们在类中可以用名称访问,而在类外部只能通过“类名.静态成员名”访问。
  • 静态方法
  1、静态方法无法访问类的非静态方法、字段、属性和事件
  2、静态方法无法通过类的对象的引用来访问
  3、静态方法可以在一切方法(静态或非静态)中访问。在类的内部直接通过名称来访问,在类的外部通过“类名.方法名”访问
  • 静态构造函数
  1、一个给定的类(或结构)只能定义一个静态构造函数
  2、静态构造函数仅执行一次,与创建了多少个这种类型的对象无关
  3、静态构造函数不带访问修饰符,也不能带任何参数
  4、静态构造函数只能访问静态成员
  5、当静态构造函数创建这个类的实例时,或在调用者访问第一个静态成员之前,运行库会调用静态构造函数
  6、静态构造函数在任何实例级别的构造函数之前执行。
  7、静态构告函数必须在该类任何实例创建之前调用
  8、静态构造函数必须在类的任何静态成员被访问之前调用
  9、静态构造函数必须在类中任何显式初始化的成员初始化完毕之后运行。
  10、CLR加载的类,其静态构造函数在程序运行期间至少执行一次
  11、静态构造函数是由CLR在当前应用程序域中加载该类的类型元数据时调用的
  12、如果没有编写静态构造函数,而类中包含有带初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数
  • 静态类 
  当一个类被定义为静态类时,它不能使用 new 关键字来创建。且仅包含静态的成员或字段
  
  
原文地址:https://www.cnblogs.com/76674718/p/1580971.html