zoukankan      html  css  js  c++  java
  • c# const 和readonly

    转载自:http://www.c-sharpcorner.com/UploadFile/b1df45/const-vs-readonly-in-C-Sharp/

    在我们的日常编码实践中,我们可以选择将变量声明为const或readonly。我从来不在乎这两者的基本区别,只是一个需要在编译时分配一个值,而另一个需要在运行时分配一个值。但这两者之间还有更多区别。让我们尝试评估这种差异。

    const:const的值是在编译时本身分配的,一旦分配,就不能更改。它们本质上是静态的,我们不能将static关键字与它们一起使用。它们也称为编译时常量,因为它们的值必须在编译时本身设置。

    readonly:readonly字段的值可以在声明时设置,也可以在类的构造函数中分配。它们也称为运行时常量,因为它们的值可以在运行时更改,但要注意的是它们只能在类的构造函数中更改。

    如前所述,这些语句定义的内容更多,接下来我们将尝试进行讨论。让我们从一个例子开始。假设我们有一个类库,例如SampleClass.cs,其中声明了两个整数类型变量a和b。在这里,a是const类型,b是readonly类型。现在,我们将这些变量的值分配为:

    public const Int32 ConstInteger = 333;
    public readonly Int32 ReadOnlyInteger = 666;

    接下来,我们构建类库,并将其DLL添加到我们的客户端项目中,然后将该项目部署到客户端计算机上。

    现在由于某些需求更改,我们需要将Const Integer的值更改为444,将ReadOnly Integer的值更改为777。

    因此,我们更新了类库中两个变量的值,并替换了客户端计算机上更新的DLL。然后我们检查结果是什么。令人震惊的是,ReadOnly Integer的值发生了变化,但Const Integer保持不变。

    为什么发生

    原因是对于在另一个程序集中使用的任何const类型变量,还必须重新编译实际代码以更新使用该代码的代码的中间语言(IL)中的const值,但这不是readonly的情况。这就是反映了readonly更改而const不变的原因。

    就像const的值嵌入在我们使用类库引用(在编译代码时)的代码IL中一样。

    因此,为了更改const的值,我们需要在使用它的位置重新编译代码,以在IL中更新其值。

    让我们尝试使用示例应用程序检查行为。为此,我们将创建一个具有类SampleClass的类库,其中包含两个整数变量,一个为const类型,另一个为readonly类型。然后构建项目。

    const vs只读在Csharp

    接下来,我们添加一个控制台应用程序。然后在此应用程序中添加对SampleClass.dll的引用,并简单地打印这些值。因此,我们的代码如下所示:

    Csharp1中的const vs只读

    最后,我们为它生成一个安装程序或.exe文件,并将安装文件安装在我们的系统上。打开我们安装它的位置并运行该应用程序。我们可以看到值已打印出来。

    const vs Csharp2中的只读

    现在,将这些变量的值更改为新值。假设将Const Integer更改为444,将ReadOnly Integer更改为777。这一次,仅构建类库,并在我们安装应用程序的位置上直接替换它的DLL。现在,运行.exe应用程序并查看结果。

    const vs Csharp3中的只读

    这次,由于我们上面讨论的相同原因,仅ReadOnly Integer的值被更改。因此,如果还需要更改Const Integer的值,则还需要重新生成控制台应用程序,然后再次安装它。试试看,这次它将起作用。

    万一我们向客户端提供基于服务的DLL,那么在这两者之间进行选择的决定最为重要。消费者客户端必须重新编译代码以确保在其代码中也更新const的更新值,这成为一种依赖。所以这就是我说这些变量的定义意味着更多的行为。

    希望您喜欢阅读。

  • 相关阅读:
    Angular 中自定义模块
    16 Angular【无人点餐无人收银系统案例】路由配置、菜品列表制作、请求数据渲染二维数组、 动态路由传值 、绑定html【基础项目
    13-angular中的路由
    Angular 互 中的数据交互 (get jsonp post )
    11-Rxjs异步数据流编程-Rxjs快速入门教程
    10 Angular中的生命周期函数--动态挂载销毁组件
    Angular 父子组件以及组件之间通讯
    Angular 中的 Dom 操作以及@ViewChild 、 Angular 执行 css3 动画
    Angular中的服务 以及自定义服务-数据持久化
    Stack与Queue
  • 原文地址:https://www.cnblogs.com/ningyouyou/p/6912942.html
Copyright © 2011-2022 走看看