Const
Const是静态常量,即在编译器编译的时候,将常量的值替换为初始化值。Const修饰的常量在编译阶段就被解析,对应的实际处理就是在代码中把引用Const变量的地方用实际值来代替。
public const string str = "Hello Wrold";
static void Main(string[] args)
{
Console.WriteLine("Str is {0}.", str );//Str is Hello Wrold.
//上面的语句在编译阶段等价于以下语句
//Console.WriteLine("Str is {0}.", "Hello Wrold");
Console.ReadKey();
}
1、Const修饰的变量在声明的时候必须初始化(不然在编译阶段无法确定该值)
2、Const本身就是static的,因此不能手动再添加static修饰符
3、Const常量可以在类中声明也可以在函数中声明
4、Const常量是直接嵌入在调用程序的IL代码中的,如果应用程序引用了某个dll下的Const常量并且部署到另一台服务器上时,当包含Const常量的dll发生变化即修改了常量的初始值的时候,应用程序未重新编译或者是只更换了部署包下面的dll那么应用程序是不会更新的,因为应用程序的IL代码里的值没有改变。如果常量的值经常需要变化那就应该使用readonly。
Readonly
Readonly是动态常量,即在程序运行的时候才会赋值,在编译阶段将其标识为只读常量而不用常量的值代替。这样动态变量不必在声明的时候就初始化,而是可以延迟到构造函数中初始化。
只读常量在运行时第一次赋值之后将不可以改变,第一次赋值之后指的是在构造函数执行完毕之后不可再赋值,在构造函数中我们多次对Readonly常量进行赋值。属性的初始化实际上是构造方法的一部分,其实是一个语法糖。
1、对于值类型,值本身不可以改变
2、对于引用类型,所指向的引用对象不可以改变,但是引用所指向的实例的值可以改变
public class Student
{
public int Age; //注意这里的Age是没有readonly修饰符的
public Student(int age)
{
this.Age = age;
}
}
public class School
{
public readonly Student Student;
public School(Student student)
{
this.Student = student;
}
}
public class Program
{
static void Main(string[] args)
{
School school = new School(new Student(10));
school.Student = new Student(20);//错误信息:无法对只读的字段赋值
school.Student.Age = 20;
}
}
区别
静态常量(Compile-time Constant) | 动态常量(Runtime Constant) | |
---|---|---|
定义 | 声明的同时要设置常量值。 | 声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。 |
对于类对象而言 | 对于所有类的对象而言,常量的值是一样的。 | 对于类的不同对象而言,常量的值可以是不一样的。 |
内存消耗 | 无。 | 要分配内存,保存常量实体。 |
综述 | 性能要略高,无内存开销,但是限制颇多,不灵活。 | 灵活,方便,但是性能略低,且有内存开销。 |
总结
静态常量是在编译时就确定好值并且在所有调用它的代码中把常量替换为初始化值,常量的值是直接嵌入到IL代码中的
动态常量是在运行过程中才确定值的,在值确认后不可再变化,每次运行时都会重新读取dll文件