c#中常量、ReadOnly和Static ReadOnly的差异
来源:互联网 发布:网络用语西瓜什么意思 编辑:程序博客网 时间:2024/06/15 01:05
在c#中常量中修饰符使字段或局部变量保持不变。ReadOnly应用于c#中的字段,在初始化后值是常量。Static ReadOnly使ReadOnly字段具有类成员的特性。(可通过类名访问)
请仔细阅读关于常量和readonly之间的差异的总结,然后我将试着解释后面的每一点。
常量与Readonly字段在c#中的10个主要区别
C#中的常量字段或局部变量:
在C#中我们将使用关键字 "const" 声明常量字段或局部变量.
当你定义一个常量字段时,它的值必须在声明本身的时候被分配,之后我们不能改变它的值。通过下面的例子来了解它
Public class Program{const int fieldConstant = 10; //字段static void Main(string[] args){const int X = 10, Y = 50; //正确的 //局部变量const int Z = X + Y; //正确的const int A = X + GettheValue(); // 错误的} public static int GettheValue(){const int localx=10;return 10;}}
前两行没有任何错误,因为X、Y、Z字段值是在编译时本身进行计算的。但是在第三行中,我们声明了一个变量“A”作为常量,并尝试使用GettheValue()方法在运行时返回值。由于必须在编译时分配常量变量,因此该行不会执行。
c#中的 字段 是在类或结构中直接声明的变量
在上面的示例中 fieldConstant 是一个字段,因为它在程序类中直接声明。
我们可以将局部变量声明为 const ,如上面所示的GetTheValue()方法。
以下构建的值类型可以声明为常量:int, long, char, float, double, decimal, bool, byte, short,string变量也可作为常量
我们可以将非基原类型赋给null来定义一个常量。但是,将一个常量引用类型声明为null是没有用的。
const string constantString = "Hi Iam Constant"; //正确的const Program program = new Program(); //错误的const Program program1 = null; //正确的
我们不能将一个常量变量声明为静态变量,因为默认情况下,常量被视为静态成员。
ReadonlyConstant r1=new ReadonlyConstant();// 请参阅下面的类声明代码Console.WriteLine(r1.ynumber); //错误的Console.WriteLine(ReadonlyConstant.ynumber);//正确的成都治疗前列腺增生要花多少钱
作为默认静态的常量变量,我们无法从类的实例中访问它。所以我们不能将const值作为ref或out参数传递。
C#中的ReadOnly字段:
在C#中我们可以将字段声明为ReadOnly而不是局部变量。
ReadOnly字段可以在声明的时候进行初始化,或者只能在对象创建时只调用一次的构造函数中进行初始化,而不是在任何其他方法中。
public class ReadonlyConstant{public const int numberOfDays = 7; //字段public readonly double PI=3.14; //内联初始化public readonly int znumber;public readonly List<int> readonlyList;public ReadonlyConstant(){znumber= 50;//构造函数初始化 }public ReadonlyConstant(int x){znumber=100;}public NormalMethod(){//readonly int i=0; 这是错误的}}
根据使用的构造函数,值可能会有所不同。即,readonly字段属于类的对象。
现在我们将讨论常量和readonly字段之间的区别,正如在第二个点中提到的,常量字段没有分配内存,而值直接嵌入IL代码中。请参阅下面的IL代码图片。
我使用resharper工具查看了上面的示例程序(ReadonlyConstant.cs)的中间语言(IL)代码。成都治疗包皮过长专业的医院
正如您可以看到的IL代码的const字段numberOfdays的值(7)直接嵌入IL代码。其中,readonly字段piValue显示为piValue。该值可在运行时获得。
这就导致了版本控制问题。
C#中常量字段的版本控制:
我将上面的示例程序编译为类库(A),并在另一个项目(B)中使用它作为参考。现在看一下生成的项目B的IL代码
在项目B的代码中,在IL代码中嵌入的常量字段数的值。现在的问题是,在源中(A类库的ReadonlyConstant.cs),常量字段 (numberOfdays )值改为5,并编译并生成一个新的dll
但是,除非我们编译这个项目,否则这个常量字段的新值不会影响B项目。编译后,新的常量字段值将嵌入到项目B的IL代码中。
为了解决这个问题,我们将使用static readonly字段。成都龙泉阴茎延长哪家医院好
C#中的static readonly
由于readonly字段值不同,取决于使用的构造函数。为了使它成为类成员(静态成员)和唯一的类,我们将在变量之前添加static关键字,如下所示。
public class ReadonlyStatic{public static readonly string x = "Hi";public static readonly string y;public ReadonlyStatic(){//y = "Hello"; 这是错误的}static ReadonlyStatic(){y = "Hello";}}
现在我们可以把它作为常量使用,在整个类中,我们将解决dll版本的常量变量问题。可能存在一些性能问题,但不需要构建目标项目,因为值可以在运行时获得。
如上面的示例所示,我们仅在声明或静态构造函数时分配static readonly字段。
C#中Readonly和Static Readonly:
以下是C#中readonly和static readonly字段之间的主要区别。
在C#中何时使用常量和readonly
当值是绝对不变的时候,使用常量,这在时间上是不变的。例如一周的天数是7。这始终是常数。而在使用static readonly时,要避免dll版本问题。
由于在IL内嵌有不变的值,我们可以使用常量修饰符来获得性能上的好处。
如果我们想要对类(或对象)的不同实例使用不同的常量值,请使用readonly。
- c#中常量、ReadOnly和Static ReadOnly的差异
- const,readonly和static readonly的区别
- C# const、readonly和static
- C# const, readonly, static readonly
- C# const, readonly, static readonly
- C# const, readonly, static readonly
- C#中const和readonly和static readonly区别
- C# const.static.readonly.
- C# const / static / readonly
- C#中const和static readonly 的区别
- C#中 Const 、readonly、static 之间的差别和关系
- C#中 Const 、readonly、static 之间的差别和关系
- C# static const和readonly区别
- C# const和static readonly区别
- C# static const和readonly区别
- C# static、 const和readonly区别
- Readonly和Disabled的差异在哪里
- C# const ,readonly,static之间的区别
- 阿里云CentOS7中安装Python3.6
- 包含所有C++头文件的头文件 <bits/stdc++.h>
- K -近邻算法(KNN:k-Nearest Neighbors)
- c#基础——事件
- mybatis foreach collection详解(转)
- c#中常量、ReadOnly和Static ReadOnly的差异
- Servlet两种配置方式的分析(web.xml&&@WebServlet(name="",urlPatterns="") )
- 献给写作者的 Markdown 新手指南
- Socket编程 之 一种死锁现象
- 解决java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException:
- ACM ICPC 2017 Warmup Contest 7(CTU Open Contest 2016)
- Linux环境下我的常用部署指令
- 链表排序(冒泡、选择、插入、快排、归并)
- java中的向上转型与向下转型