中易网

c#中static和const有什么区别

答案:2  悬赏:0  
解决时间 2021-04-28 21:14
  • 提问者网友:独菊痴梦
  • 2021-04-27 22:20
c#中static和const有什么区别
最佳答案
  • 二级知识专家网友:年轻没有失败
  • 2021-04-27 22:36
们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。
二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。
明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:
1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly A = B * 20;
static readonly B = 10;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
5. void SomeFunction()
{
const int a = 10;
...
}

1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。
全部回答
  • 1楼网友:修女的自白
  • 2021-04-28 00:12
const 的概念就是一个包含不能修改的值的变量。 常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。 如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。 readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。 因为 readonly 是在计算时执行的,当然它可以用某些变量初始化。 readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。 readonly 关键字与 const 关键字不同。 1. const 字段只能在该字段的声明中初始化。 readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。 2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。 3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。 4.const 对于引用类型的常数,可能的值只能是 string 和 null。 readonly可以是任何类型 * 需要注意的一个问题是: 对于一个 readonly 的 reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。 public static readonly class1 my = new class1(); … my.someproperty = 10; //正常 my = new class1(); //出错,该对象是只读的 但是,如果上例中的 class1 不是一个 class 而是一个 struct,那么后面的两个语句就都会出错。 static readonly: java 中 static 是当载入一个类时执行一次的。 c#中是怎么执行的,我没有查到。很奇怪几乎每本java的书都会说static的问题,c#的往往只说怎么用,但是应该是在main函数调用之前初始化,所以static readonly也是运行时的,可以用变量付值,如: private static readonly string path = system.windows.forms.application.startuppath + “aaa”;
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息