在C#中使用private const
变量或private static readonly
变量之间是否有区别(除了必须分配const
编译时表达式)?
由于它们都是私有的,因此没有与其他库的链接.它会有什么不同吗?例如,它可以产生性能差异吗?实习字符串?有什么相似的吗?
好吧,你可以在属性中使用consts,因为它们作为编译时存在.您无法预测静态只读变量的值,因为.cctor
可以从配置等初始化它.
在使用方面,常量被烧入调用代码中.这意味着如果重新编译库 dll来更改公共常量,但不更改消费者,那么消费者仍将使用原始值.使用只读变量,这不会发生.这样做的结果是常量(非常,非常轻微)更快,因为它只是加载值(而不是必须取消引用它).
重新实习; 尽管您可以手动执行此操作,但这通常是文字的编译器/运行时功能; 如果你通过文字初始化一个只读字段:
someField = "abc";
然后"abc"
将被拘禁.如果你从配置中读取它,它将不会.因为常量字符串必须是文字,它也将被实习,但它的访问方式不同:再次,从字段读取是一个去引用,而不是一个ldstr
.
实际上,这两种类型在初始化后无法更改,但它们之间存在一些差异:
'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关键字)但不能保存枚举
有关常量的注意事项是它们实际上存储在您的可执行文件中,因此声明其中很多将增加您的可执行文件大小.
通常,这不是一个大问题,但是我的一个朋友在公司工作,强制执行"一切必须是const"规则,并设法显着增加他们编译的可执行文件大小.
这是C#.NET const,readonly和static readonly字段之间的区别(来自本文)。
常数:
默认为静态
必须具有编译时值(即:您可以具有“ A” +“ B”,但不能具有方法调用)
可以在属性中使用
复制到使用它们的每个程序集中(每个程序集都会获取值的本地副本)
可以在函数中声明
只读实例字段:
创建实例时进行评估
构造函数退出时必须具有设置值
静态只读字段:
当代码执行达到类引用时进行评估(即:创建新实例或执行静态方法)
静态构造函数完成时必须具有评估值
您确实不希望将ThreadStaticAttribute放在这些对象上(因为静态构造函数将仅在一个线程中执行,并且将为其线程设置值;所有其他线程将具有未初始化的值)