和数据类型相关,看是不是引用类型
C#不同于C++的是,一般的类都是引用类型,相当于只是一个地址,使用const修饰一个对象(这样看起来很正常的操作)在C#中是错误的,因为在编译阶段,地址是不能确定的,在运行时才是真正地分配内存,自然不能使用const,相对应的是,值类型都是可以正常使用const的。
C#中使用readonly实现只读的限制,readonly用于修饰成员变量,值类型和引用类型都可以使用,readonly修饰的成员变量,可以在声明时赋值,也可以在构造函数里面赋值,readonly的修饰的变量,不像const那样限制调用非const函数,只是限制这个被修饰的值本身的值不能被改变而已(不能被赋值,不能更改引用,也就是这个指针不能更改指向的位置了),其自身包含的各种成员值都是允许修改的,函数调用也没有限制。
using Vector = System.Collections.Generic.List<float>; class Application { // readonly 可以先不赋值,和const不一样 readonly int x; readonly Vector y; // readonly 可以直接在声明的位置赋值 readonly Vector z = new Vector(); // const 可以使用 const int a = 0; // const 不可以使用 // const Vector b = new Vector(); public Application() { // readonly 在构造函数里面赋值 x = 0; y = new Vector(); } // 在一个普通的函数内部 public void SomeMethod() { // readonly 不能赋值 // x = 1; // readonly 可以对本身的数据进行操作 y.Add(0); // const 正常 const int c = 0; // const 引用类型还是不能使用,还是那个原因 // const Vector d = new Vector(); // readonly 不能修饰局部变量 // readonly int xx = 0; // readonly 不能修饰局部变量,只能用于成员变量 // readonly Vector yy = new Vector(); } static void Main() { } }