第二遍文章我打算把const和readonly的区别拿出来讲下,因为写代码这么久我都还没搞清楚这两者的区别,实在有点惭愧,所以这一次我打算搞清楚它。

定义

来看看MSDN的解释:

readonly:readonly关键字是可以在字段上使用的修饰符。当字段声明包括readonly修饰符时,该声明引入的字段赋值只能作为声明的一部分,或者出现在同一类的构造函数中。

const:使用 const 关键字来声明某个常量字段或常量局部变量。 常量字段和常量局部变量不是变量并且不能修改。

太多理论的讲解有些人可能看了更犯晕,所以直接写些代码我觉得可能比较直观好理解。

举例

我们先来看下const

public class ConstTest
{
class SampleClass
{
public int x;
public int y;
public const int c1 = ;
public const int c2 = c1 + ;
public static const int z=8; //这个写法错误,因为const是静态常量,可看下面提供c1的IL语言图片。

            //变量可以在这里初始化值,但是如果把const放在这里初始化,编译会出错(赋值号左边必须为变量、属性或索引器)
public SampleClass(int p1, int p2)
{
x = p1;
y = p2;
}
}
static void Main()
{
SampleClass mC = new SampleClass(, );
Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);
Console.WriteLine("c1 = {0}, c2 = {1}",SampleClass.c1, SampleClass.c2); //类型引用
}
}
/* Output
x = 11, y = 22
c1 = 5, c2 = 10
*/
来看下IL语言:

c2和y省略在这里省略,从上面的图我们得出了一个结论:

那就是静态常量,那什么是静态常量呢?静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。即图中里面的c1和c2,它们都是在编译的时候值就确定下来(c1=5,c2=10),这个相信大家也比较好理解。

我们再来看readonly:

public class ReadOnlyTest
{
class SampleClass
{
public readonly int x;
public readonly int y = ;
public static readonly int z=;
            //无参构造函数初始化readonly常量
public SampleClass()
{
y = ;
}
            //静态无参构造函数内初始化static readonly常量
static SampleClass()
{
z = ;
}
            //有参构造函数初始化readonly常量
public SampleClass(int p1, int p2)
{
x = p1;
y = p2;
}
} static void Main()
{
//访问静态成员
Console.WriteLine(SampleClass.z); //访问非静态成员
SampleClass p1 = new SampleClass(, ); // OK
Console.WriteLine("p1: x={0}, y={1}", p1.x, p1.y);
SampleClass p2 = new SampleClass();
Console.WriteLine("p2: x={0}, y={1}", p2.x, p2.y); Console.ReadKey();
}
}
 /*
Output:
23
 p1: x=11, y=21
 p2: x=0, y=24
    */
同样的,来看IL语言:

我们先看下什么是动态常量:

动态常量,是指值在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。

通过const和readonly的代码我们可以得出以下结论:

1.readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定初始值)将不可更改,可读不可写。

2.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数,例如z参数的初始化过程。

3.const和static readonly定义的常量是静态的,只能由类型直接访问;而readonly定义的常量是非静态的,只能由实例对象访问。

const和readonly比较

1.const默认是静态的,只能由类型访问,不能和static同时使用,否则编译错误;readonly默认是非静态,由实例对象来访问,可以显式使用static定义为静态成员。

2.const只能引用在值类型和string类型上,其他引用类型常量必须声明为null,否则以new为const引用类型常量赋值,编译器会提示错误,原因是构造函数初始化在运行时,而非编译时;readonly只读字段可以是任意类型,但是对于引用类型字段来说,readonly不能限制对该对象实例成员的读写控制。

3.const必须在字段声明时初始化;而readonly可以在声明时,或者构造函数中进行初始化,不同的构造函数可以为readonly常量实现不同的初始值

4.const可以定义字段和局部变量;而readonly则只能定义字段

5.const由于是静态常量所以在编译时会对常量进行解析,而readonly是动态常量在编译期间编译器将其标示为只读常量,而不用常量的值代替,这样就不必在声明的时候就初始化,而可以延迟到构造函数中初始化

6.从应用角度来看,对于恒定不变且单独使用的量来说,应该考虑声明为const常量,例如性能比,百分比等;而对于可能随实际运行发生变化的量,应该考虑声明readonly常量,例如日期或时间,数据库中的主键id等

以上内容希望对一些朋友带来帮助~~~

最新文章

  1. Swift-UIButton
  2. sublime自动生成头部注释
  3. iOS - Bitcode App 瘦身中间码
  4. 【如何快速的开发一个完整的iOS直播app】(播放篇)
  5. 百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题
  6. JS实现base64加密解密
  7. SQL SERVER同步环境新增发布对象时不能生成(sp_MS+表名)同步存储过程
  8. glusterFS分布式文件系统的搭建
  9. 【原创】小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载五(给按钮加图标)
  10. 简单讨论数据类型(byte)强制转化后的数值变化规律
  11. javascript模式——Command
  12. 使用Webpack加速Vue.js应用的4种方式
  13. word设置每页50行
  14. window server 2008 安装Oracle10g
  15. redis基础2
  16. 用stringstream可以用来分割空格、tab、回车换行隔开的字符串:
  17. 简单的TSQL基础编程格式,存储过程,视图
  18. 类库中使用WPF 资源文件
  19. WDA-FPM-1-Roadmap(GAF)
  20. Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :

热门文章

  1. LightOJ 1085(树状数组+离散化+DP,线段树)
  2. 数据存储(三)--JSON数据处理
  3. ASP.NET MVC4 json序列化器
  4. Android设计中的.9.png
  5. 《think in python》学习-6
  6. Spring MVC JSON 实现JsonSerializer Date类型转换
  7. linux创建用户和组
  8. 使用runOnUiThread更新UI
  9. 航频之声APP截图
  10. 总结下js中匿名函数的写法~好几天没写博客了。。。