const和static readonly区别

Const

用于指定字段或局部变量的值是常数,不能被修改。常量的值在编译的时候确定,编译后,CLR将常量的值保存在Assembly的原数据中。当代码引用常量时,CLR在元数据中查找该符号,将提取的常量值嵌入到IL中,所以常量没有地址以及相应的分配内存,而且不能通过引用传递变量

readOnly

在字段上使用的修饰符,表示该字段是只读的。当一个字段在声明为readOnly的时候,只有两种方式可以对其赋值,即作为声明的一部分出现,或者在同一类的构造函数中。
对于实例字段,在包含字段声明的类的实例构造函数中;或者,对于静态字段,在包含字段声明的类的静态构造函数中。也只有在这些上下文中,将

因此,Const必须在声明就初始化,它既可用来修饰类中的成员,也可修饰函数体内的局部变量。readOnly既可以在声明时初始化也可以在构造器中初始化,因此根据使用的构造函数可能具有不同的值,它只可以用于修饰类中的成员。

Const和Static readOnly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。但由于他们本质的区别,Const只能修饰字符串和整形等值类型的数据。

static readonly MyClass myins = new MyClass();
static readonly int [] constIntArray = new int[] {1, 2, 3};

void SomeFunction()
    {
      const int a = 10;
       ...
    }

这种情况下就不能换成 Const 但下面这种情况就可以

static readonly A = B * 20;
static readonly B = 10;

 

下面就一些例子来说明下:

using System;
class P
{
    static readonly int A=B*10;
    static readonly int B=10;  

    static readonly int C=B*10;  
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1},C is {2},",A,B,C);
    }
}

对于上述代码,输出结果是多少?很多人会认为是A is 100,B is 10,C is 100吧!其实,正确的输出结果是A is 0,B is 10,C is 100。因为给A赋值时,B并没有赋值为10,它的值为0

class P
{
    const int A=B*10;
    const int B=10;  

   const  int C=B*10;  
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1},C is {2},",A,B,C);
    }

}

对于上述代码,输出结果又是多少呢?这次正确的输出结果是A is 100,B is 10,C is 100 因为B是常量,在编译期间就赋值了



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值