C#中 const 和 readonly 的不同

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”;

(0)

相关推荐

  • 深入探讨C#中的const、readonly关键字

    首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看msdn上面对const是怎么说的,我们会看到.不能修改,编译时常量这些关键性信息. Q:  const为什么不能被修改. A:这个很简单,很多教科书上面都说,当编译器编译时,会将常量的值保存在该程序集的元数据中,下面我们做个实例 看一看. ①:新建一个projectA. 复制代码 代码如下: // P

  • 浅谈c#中const与readonly区别

    const 的概念就是一个包含不能修改的值的变量. 常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量. 如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的. readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值. 因为 readonly 是在计算时执行的,当然它可以用某些变量初始化. readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonl

  • C#基础知识系列八const和readonly关键字详细介绍

    前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了解一下静态常量和动态常量. 静态常量:是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值. 而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化.现在再来说明const与

  • 浅谈Java中的final关键字与C#中的const, readonly关键字

    在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

  • c#.net中const和readonly的区别

    (1) readonly和const都是用来标示常量的.(2) 初始化赋值不同.const修饰的常量必须在声明的同时赋值.例如: 复制代码 代码如下: public class Class1{    public const int MaxValue = 10;       //正确声明    public const MInValue;                   //错误:常量字段要求提供一个值    public Class1()    {        MinValue = 10

  • C#中const 和 readonly 修饰符的用法详解

    1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. const 必须在申明中初始化.之后不能再修改. 4. readonly可以在申明中初始化,也可以在构造函数中初始化,其它情况不能修改. namespace const_and_readonly { class Program { static void Main(string[] args) { Co

  • C#中 const 和 readonly 的不同

    const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的. readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值.因为 readonly 是在计算时执行的,当然它可以用某些变量初始化.readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活

  • C#中const和readonly的用法比较

    const常量 创建const常量有两个优点,第一个优点是由于使用了有意义的名称,和数字相比,const常量更易于阅读和修改:第二个优点是由于编辑器保证他的值在程序运行的过程中保持固定不变,和变量相比,const常量更健壮 声明const常量的语法如下: 访问修饰符 常量关键字 数据类型 常量名 = 初始化: public const double PI = 3.1415926: const常量只能在声明的时候初始化,不能再其他的地方赋值,运行过程中它的值保持不变,特别需要注意的是,类的cons

  • C++ 中 const和static readonly区别

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

  • C# 中const,readonly,static的使用小结

    平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中的 const,static 和 readonly 关键词,放在一起比较一下看看如何选择. 理解 const const 常用来定义一个常量,什么意思呢?就是这个常量在你程序的生命周期内都不会被改变,因此,必须在声明常量时为其赋值,从技术角度上来说:这个常量值又被称为 编译时 值,用 const 定

  • C#中的const和readonly关键字详解

    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1.声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student { public const int age; } 生成的时候,会报如下错: 正确的应该这样写: public class Student { public const int age = 18; } 2.声明const类型变量可以用static修饰吗? 不可以 public class Student { publ

  • C#中const,readonly和static关键字的用法介绍

    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const const默认是静态的,可以通过"类名.字段名"来访问. const变量只能在声明的时候赋值,不能在构造函数中为const类型变量赋值. 一旦程序集被编译,const变量会被写进程序集的IL代码中.如果想修改const变量值,必须在修改值后再重新生成程序集. const是编译期变量 public class T

随机推荐