C#中的const与static readonly区别
在许多教程中常看到列出了两者之间的区别
const
(1)在编译期间解析常量
(2)必须在申明时就初始化
(3)即可用来修饰类中的成员,也可用来修饰函数中的局部变量
static readonly
(1)在运行期间解析常量
(2)即可在申明时初始化,也可在构造器中初始化
(3)只可用来修饰类中的成员
从上面的区别看似乎也很明白,可是在实际的使用中还是不太好把握。在c#中有两种不同的常量:
静态常量(compile-time constants) 和动态常量(runtime constants),他们之间有不同的特性,错误的使用不仅会损失效率,
还可能造成错误。相比之下,静态常量在速度上会稍快写,但是灵活性却比动态常量差。
从我个人对他们的使用中总结出有如下三点需要注意:
(1)当使用new来初始化一个常量,不管他是值类型,还是引用类型都只能使用static readonly

1

2

3

4

5

6

(2) 比较编译时和运行时他们之间的区别
1
static readonly A=B*20;
2
static readonly B=10;
3
//在编译的时候B并没有被编译为10,A也没有被编译为200
4
const A=B*20
5
const B=10
6
//显然在编译的时候,就把B编译为10,A编译为200了,而不是在运行时计算B*20

2

3

4

5

6

(3)在不同的项目中使用const和static readonly的区别

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

总结:
1 const是编译时常量,static readonly是运行时常量
2 效率优先,则用const(编译时赋值);安全优先,则static readonly(比如有a.dll和b.dll,a.dll中有一个const变量,b.dll引用了它,如果a.dll中的这个变量改变了值,但不重新编译b.dll就会造成问题了,而使用static readonly就不会有问题。)
3 readonly在声明时直接赋值只是语法糖,实际编译时这个赋值会放到constructor里面去。
4 readonly可在constructor里多次赋值,但是出了constructor就不能再改;const只能赋一次值。