C#定义常量的两种方法

在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。

  对于静态常量(Compile-time constant),它的书写方式如下:

  public const int MAX_VALUE = 10;

  为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这里只是为了方便说明)。

  public static const int MAX_VALUE = 10;

  用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。此外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:

  int nValue = MAX_VALUE;

  这句在编译之后,和如下这句所产生的中间语言代码是一样的。

  int nValue = 10;

  不过,在用const来定义常量的时候,在类型上有很多限制。首先,此类型必须属于值类型,同时此类型的初始化不能通过new来完成,因此一些用struct定义的值类型常量也不能用const来定义。

  相对于const而言,用readonly来定义常量要灵活的多,它的书写方式如下:

  public readonly int MAX_VALUE = 10;

  为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类的其他成员一样拥有独立的空间。此外,readonly所定义的常量除了在定义的时候可以设定常量值外,还可以在类的构造函数中进行设定。由于readonly所定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的常量。

  综合上面所述,至于对比两者之间的区别具体如下。

 静态常量(Compile-time constant)动态常量(Runtime constant)
定义声明的同时要设置常量值。声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。
类型限制首先类型必须属于值类型范围,且其值不能通过new来进行设置。没有限制,可以用它定义任何类型的常量。
对于类对象而言对于所有类的对象而言,常量的值是一样的。对于类的不同对象而言,常量的值可以是不一样的。
内存消耗无。要分配内存,保存常量实体。
综述性能要略高,无内存开销,但是限制颇多,不灵活。灵活,方便,但是性能略低,且有内存开销。

  对于在定义常量的时候,到底是用const来定义还是readonly来定义,我以前为了追求性能,因此尽量用const来定义。但是在此书中,提到了一个关于使用const会产生潜在的bug。就是在程序中使用DLL类库某个类的静态常量时,如果在类库中修改静态常量的值,其它接口没有发生变化,一般来说,程序调用端是不需要重新编译,直接执行就可以调用新的类库。不过就是在此情况下,会产生潜在的bug。这是由于静态常量在编译的时候,是用它的值去替换常量,因此在调用端的程序也是这样进行替换的。

  例如:在类库中定义了一个静态常量,如下:

public const int MAX_VALUE = 10;

  那么对于程序中调用此静态常量这段代码,在编译后产生的中间语言代码中,是用10来进行替换,即使用静态常量的地方,改为10了。

  那么当类库的静态变量发生变化后,例如:

public const int MAX_VALUE = 15;

  那么对于调用端程序是可以在没有重新编译的情况下进行运行,不过此时程序的中间语言代码对应于静态变量的值是10,而不是新类库中的15。因此这样产生的不一致,程序会引发潜在的bug。解决此类问题的方法,就是调用端程序在更新类库之后重新编译一下,即生成新的中间语言代码。

  对于如上在const定义常量时所存在的潜在bug,在用readonly定义常量时是不会发生的。因为readonly定义的常量类似于类的成员,因此在访问的时候需要根据具体常量地址来访问,从而避免此类bug。

  鉴于此,笔者建议用readonly来替换const去定义常量。 
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 C# 中,枚举类型可以定义常量的类型。常量的类型可以是整数、浮点数或字符等。下面是一个定义枚举类型和常量类型的示例: ```csharp enum Status { OK = 0, Error = 1 } const int MaxValue = 100; const double Pi = 3.14; const char FirstLetter = 'A'; ``` 在上面的示例中,枚举类型 `Status` 定义了两个常量 `OK` 和 `Error`,它们的类型是整数,默认情况下从 0 开始自动编号。常量类型 `MaxValue` 的类型是整数,它的值为 100。常量类型 `Pi` 的类型是浮点数,它的值为 3.14。常量类型 `FirstLetter` 的类型是字符,它的值为 'A'。 ### 回答2: C是一种高级的编程语言,最初由贝尔实验室的Dennis Ritchie在20世纪70年代开发。C语言是一种非常重要的编程语言,它为现代计算机科学和软件开发的发展做出了巨大贡献。 C语言在计算机科学领域中广泛应用,尤其在系统级编程、操作系统和嵌入式系统开发方面。C语言的优势在于它的可移植性、效率和灵活性。它具有简洁的语法和强大的控制结构,使程序员能够更好地控制计算机的底层细节,同时也提供了丰富的库函数来支持开发各种应用。 C语言的语法和结构也成为其他编程语言的基础,包括C++、Java和Python等。许多编程教育课程都以C语言作为学习的起点,因为它能够帮助学习者更好地理解计算机的工作原理和编程概念。 C语言的应用范围非常广泛,它可以用于开发桌面应用程序、网络应用、游戏和手机应用等。很多知名的软件产品,如Windows操作系统和MySQL数据库管理系统,都是使用C语言开发的。 虽然C语言的学习曲线较陡峭,但它对于想要深入了解计算机科学和系统级编程的开发人员来说,是必不可少的基础知识。掌握C语言可以帮助程序员理解底层编程概念,提高编程技能,并且能够更好地理解其他高级编程语言。 总的来说,C语言的发展对计算机科学领域有着深远的影响。它是一种强大而灵活的编程语言,为计算机软件开发提供了基础,并且成为其他编程语言的基础。掌握C语言对开发人员来说是非常有价值的,可以帮助他们在软件开发领域取得更好的成就。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值