区分const,static,readonly,volatile四个关键字

const:表示常量,变量的值是绝不会被改变的,常量的值是在编译时就已经确定了。编译器会把常量的值保存在程序集的元素据里面,在C#里面,下面列举的简单类型才能被定义为 常量:Boolean,  Char,  Byte,  SByte,  Int16,  UInt16 ,  Int32,  UInt32 ,  Int64, UInt64 ,  Single ,  Double ,  Decimal, String。如果定一个引用类型为常量,则必须把该变量的值设为null。因为常量的值是不会改变的,所以常量也常常被认为是定义的类型的一部分。换句话说,常量通常也是静态的。当定义一个常量符号,编译器会在程序集的元素据里面查找它的值,并把值嵌入到生成的IL里面,也因此在运行时,常量不需要分配任何内存。当然,也不能获取常量的地址以及通过引用的方式传递常量。这些限制让常量不能很好的跨程序集版本。

例如:

namespace TypeTest
{
    public sealed class SomeLibType
    {
        public const Int32 MaxEntriesInList = 50;
    }

    public sealed class Program
    {
        public static void Main()
        {
            Console.WriteLine("最大的整型的数值为:" + SomeLibType.MaxEntriesInList);
        }
    }
}

查看下Main部分的IL代码可以清楚知道常量的值已经嵌入在IL代码里面了,如下:

其实我们还可以看看关于定义的MaxEntriesInList,之前有说过常量一般也是静态的,如下:

 

static:表示类型状态的一部分,静态意味着共享。相对于C++,C#里面没有全局函数和全局变量的概念,等效的是使用静态。两者在功能上没有什么差异,只是静态字段和方法可以使用访问修饰符。静态类对应的IL会自动标记为abstract和sealed。

readonly:只有在构造函数里面才能改变它的值,只能用于字段,不能用于局部变量。修饰数组时,不会冻结数组的内容,只会冻结数组的元素数量,因为无法将只读字段赋值为一个新的实例。不过,数组中的单个元素是可写的。

volatile:编译器或CPU有时会对代码进行优化,是指令不按照它们编码的顺序执行,或者干脆拿掉一些无用的指令。若代码在一个线程上执行,这样的优化没有什么影响。如果在多线程环境下,就肯能造成出乎意料的效果。这时可以使用volatile来强迫所有的读写操作按照代码指定的顺序发生。

 

注   《CLR via C#》(Jeffrey Richter著)——.NET 界的经典之作,读的过程写点笔记跟大家分享,我也推荐大家看英文版,能够直接领会原意 

时间: 2024-10-26 13:15:08

区分const,static,readonly,volatile四个关键字的相关文章

C# FAQ: const和static readonly有什么区别?

ado|区别 我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值.而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值.明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:1. static readonly MyClass myins =

php类中的$this,static,final,const,self这几个关键字使用方法_php实例

本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下: <?php class MyClass{ private $name; public function __construct($name){

const 与 static readonly的区别

google到一篇讲const 与 static readonly的文章 还不错~草译一下 The difference is that the value of a static readonly field is set at run time, and can thus be modified by the containing class, whereas the value of a const field is set to a compile time constant. 被 st

C语言易混淆关键词详解-const, static, extern, typedef, 声明

Const Const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能比较好理解, int i = 5; const int *a = &i; *a = 8;   //报错, 只读不能赋值 i = 10;   //OK Const最有用处的地方是用它来限定函数的形参, 来表明该函数不能修改实参指针所指向的数据. 同上面的理解, 并不表示这个数据是常量, 在函数外是可以

[c#基础]关于const和readonly常见的笔试题剖析

引言 有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己.今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯了,没想过为什么这么用,就好比为什么一直用右手拿筷子,这么习惯.为什么我要用右手拿筷子,为什么不用左手呢?突然你就这么干了,发现你和周边很不协调,而且还夹不了菜.const和readonly也一样,习惯了,一直这样用,也就没追究过.突然被那么一问,还真说不出来个一二,今天就细细的研究下,到底这东东是

iOS开发:正确使用const,static,extern

  前言 本篇主要介绍在开发中怎么使用const,static,extern3个关键字,如果喜欢我的文章,可以关注我微博:吖了个峥,也可以来小码哥,了解下我们的iOS培训课程.后续还会更新更多内容... 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译阶段. 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误. 宏

C#中 const 和 readonly 的区别

ado|区别 const 和 readonly 的区别,总是不太清楚,于是查了查资料.   const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的.   readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值.因为 readonly 是在计算时执行的,当然它可以用某些变量初

C# const 和 readonly 用法及区别

readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值. 因为 readonly 是在计算时执行的,当然它可以用某些变量初始化. readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活. readonly 关键字与 const 关键字不同. 1. const 字段只能在该字段的声明中初始化.    readonly 字段可以在声明或构造函数中初始化.因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 2. cons

C# .NET Quiz: const vs. readonly

ado 关于C#中的const和readonly想必使用C# .NET开发的朋友都很了解吧?总结一下const和readonly也就这么几条吧: const和readonly的值一旦初始化则都不再可以改写: const只能在声明时初始化:readonly既可以在声明时初始化也可以在构造器中初始化: const隐含static,不可以再写static const:readonly则不默认static,如需要可以写static readonly: const是编译期静态解析的常量(因此其表达式必须在