Hos*_*Aly 31 c# const readonly
在C#中使用private const
变量或private static readonly
变量之间是否有区别(除了必须分配const
编译时表达式)?
由于它们都是私有的,因此没有与其他库的链接.它会有什么不同吗?例如,它可以产生性能差异吗?实习字符串?有什么相似的吗?
Mar*_*ell 34
好吧,你可以在属性中使用consts,因为它们作为编译时存在.您无法预测静态只读变量的值,因为.cctor
可以从配置等初始化它.
在使用方面,常量被烧入调用代码中.这意味着如果重新编译库 dll来更改公共常量,但不更改消费者,那么消费者仍将使用原始值.使用只读变量,这不会发生.这样做的结果是常量(非常,非常轻微)更快,因为它只是加载值(而不是必须取消引用它).
重新实习; 尽管您可以手动执行此操作,但这通常是文字的编译器/运行时功能; 如果你通过文字初始化一个只读字段:
someField = "abc";
Run Code Online (Sandbox Code Playgroud)
然后"abc"
将被拘禁.如果你从配置中读取它,它将不会.因为常量字符串必须是文字,它也将被实习,但它的访问方式不同:再次,从字段读取是一个去引用,而不是一个ldstr
.
mel*_*etz 12
实际上,这两种类型在初始化后无法更改,但它们之间存在一些差异:
例如,const可以在这种情况下使用:
public class MathValues
{
public const double PI = 3.14159;
}
Run Code Online (Sandbox Code Playgroud)
对于这种情况,readonly会更好:
public class Person
{
public readonly DateTime birthDate;
public Person(DateTime birthDate)
{
this.birthDate = birthDate;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public class Person
{
public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}
Run Code Online (Sandbox Code Playgroud)
'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字段之间的区别(来自本文)。
常数:
只读实例字段:
静态只读字段:
C#.Net 中const字段和readonly字段之间存在显着差异
const 默认是静态的,需要用常量值初始化,以后不能修改。构造函数中也不允许更改值。它不能与所有数据类型一起使用。对于前日期时间。它不能与 DateTime 数据类型一起使用。
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public readonly string Name = string.Empty; //No error, legal
Run Code Online (Sandbox Code Playgroud)
readonly 可以声明为静态,但不是必需的。声明时无需初始化。可以使用构造函数分配或更改其值。因此,它在用作实例类成员时具有优势。两个不同的实例化可能具有不同的只读字段值。对于前-
class A
{
public readonly int Id;
public A(int i)
{
Id = i;
}
}
Run Code Online (Sandbox Code Playgroud)
然后只读字段可以用即时特定值初始化,如下所示:
A objOne = new A(5);
A objTwo = new A(10);
Run Code Online (Sandbox Code Playgroud)
这里,实例 objOne 的 readonly 字段值为 5,而 objTwo 的值为 10。使用 const 是不可能的。