目录
static
是什么
- static修饰的变量或者方法不属于任何一个实例对象,而是被所有的对象所共享。
- 在类被第一次使用的时候,就会去加载被static修饰的部分,然后CLR会在内存中分配空间,只分配一 次。
应用场景
可以将一些只执行一次的初始化操作放到static代码块中去执行,后面根据需要还可以对static修饰的变量进行重新赋值。
GC会扫描并释放静态资源吗?
GC会扫描静态资源但是不会释放静态资源,静态资源不属于任何一个实例对象,所有的静态资源都会被存储在”静态存储区”里面,一直到程序退出,才会被回收。
静态对象是单例模式的体现吗?
- 不一定,单例模式要保证对象只能被创建一次。如果静态对象是私有的,并且只能通过静态方法来获取,那它就是单例模式的体现。
- 如果静态对象不是私有的,那它就可以被重新赋值,所以也就不是单例模式的体现。
静态字段/静态构造函数
- 静态构造函数是通过CLR调用的 ,静态构造函数在对象使用前完成初始化并且只执行一次。
- 静态字段也是由CLR调用的,静态字段在类型使用前完成初始化并且只执行一次。
const
- const是静态常量,编译时常量,属于类型级,通过类名直接访问,能被所有的对象共享。
- 叫编译时常量的原因是,它编译时会将其替换为所对应的值。
- 静态常量在速度上会稍稍快一些,灵活性却比动态常量差一些。
- 静态常量,隐式是静态的,不能再用static重复修饰。
- 在声明时初始化。
- 静态常量只能用来声明简单的基本数据类型。比如:int,long,string。
- 要声明一些从不改变且处处唯一的常量,使用静态常量。
readonly
- readonly是动态常量,运行时常量,属于对象级,可以通过对象来进行访问。
- 动态常量的值在运行时获取。
- 动态常量在性能上稍微差一点,灵活性比const好。
- readonly可以被static修饰,这时的static readonly和const非常相似。
- readonly可以在声明时初始化,或者在构造函数里面进行初始化。
- 动态常量可以是任意类型的数据。
static readonly
- static readonly是静态只读常量,如果在构造函数里面进行初始化,必须是静态无参构造函数。
- 对于那些本质上应该是常量,但是却无法使用const来声明的类型,就可以使用static readonly来进行 修饰。