当前位置:  开发笔记 > 编程语言 > 正文

C#中私有const和私有只读变量之间有区别吗?

如何解决《C#中私有const和私有只读变量之间有区别吗?》经验,为你挑选了4个好方法。

在C#中使用private const变量或private static readonly变量之间是否有区别(除了必须分配const编译时表达式)?

由于它们都是私有的,因此没有与其他库的链接.它会有什么不同吗?例如,它可以产生性能差异吗?实习字符串?有什么相似的吗?



1> Marc Gravell..:

好吧,你可以在属性中使用consts,因为它们作为编译时存在.您无法预测静态只读变量的值,因为.cctor可以从配置等初始化它.

在使用方面,常量被烧入调用代码中.这意味着如果重新编译 dll来更改公共常量,但不更改消费者,那么消费者仍将使用原始值.使用只读变量,这不会发生.这样做的结果是常量(非常,非常轻微)更快,因为它只是加载值(而不是必须取消引用它).

重新实习; 尽管您可以手动执行此操作,但这通常是文字的编译器/运行时功能; 如果你通过文字初始化一个只读字段:

someField = "abc";

然后"abc"将被拘禁.如果你从配置中读取它,它将不会.因为常量字符串必须是文字,它也将被实习,但它的访问方式不同:再次,从字段读取是一个去引用,而不是一个ldstr.



2> melculetz..:

实际上,这两种类型在初始化后无法更改,但它们之间存在一些差异:

'const'必须在声明它们的地方进行初始化(在编译时),而'readonly'可以在声明它的地方或构造函数(ar运行时)内初始化.

例如,const可以在这种情况下使用:

public class MathValues
{
  public const double PI = 3.14159;
}

对于这种情况,readonly会更好:

public class Person
{
    public readonly DateTime birthDate;

    public Person(DateTime birthDate)
    {
        this.birthDate = birthDate;
    }
}

要么

public class Person
{
    public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}

'const'是静态的,因此它在该类的所有实例之间共享,可以直接访问(如MathValues.PI),而'readonly'不是静态的.因此,像'static const'这样的声明是非法的,因为const是静态的,但'static readonly'是合法的

'const'只能包含整数类型(sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool或string),枚举或对null的引用(不是类)或者结构因为它们是在运行时使用'new'关键字初始化的,而'readonly'可以包含复杂的类型,结构或类(通过在初始化时使用new关键字)但不能保存枚举



3> Soviut..:

有关常量的注意事项是它们实际上存储在您的可执行文件中,因此声明其中很多增加您的可执行文件大小.

通常,这不是一个大问题,但是我的一个朋友在公司工作,强制执行"一切必须是const"规则,并设法显着增加他们编译的可执行文件大小.


相信我,这只是奇怪的编码指南的冰山一角.其他宝石包括强制性的else块,即使它们是空的,并且总是在内部调用公共属性.

4> Rinat Abdull..:

这是C#.NET constreadonlystatic readonly字段之间的区别(来自本文)。

常数

默认为静态

必须具有编译时值(即:您可以具有“ A” +“ B”,但不能具有方法调用)

可以在属性中使用

复制到使用它们的每个程序集中(每个程序集都会获取值的本地副本)

可以在函数中声明

只读实例字段

创建实例时进行评估

构造函数退出时必须具有设置值

静态只读字段

当代码执行达到类引用时进行评估(即:创建新实例或执行静态方法)

静态构造函数完成时必须具有评估值

您确实不希望将ThreadStaticAttribute放在这些对象上(因为静态构造函数将仅在一个线程中执行,并且将为其线程设置值;所有其他线程将具有未初始化的值)

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有