声明字符串public static readonly与public const对比public static const

时间:2010-12-09 20:13:34

标签: c# string

在每个项目中,我们都有一个文件用于存储该项目中使用的各种SQL语句。关于如何声明类以及如何声明字符串,有一些变体。

示例类声明:

internal sealed class ClassName
internal static class ClassName
public sealed class ClassName
public static class ClassName
internal class ClassName

示例字符串声明:

internal const string stringName
internal static string stringName
public static readonly string stringName
public static string stringName
public const string stringName

我不明白不同声明之间的性能影响。这种情况/场景是否有最佳实践?

5 个答案:

答案 0 :(得分:80)

  

我不明白不同声明之间的性能影响

评估数据库查询的成本可能是数百万数十亿倍于从常量字段更改为只读字段的成本差异,反之亦然。当您拥有以毫秒为单位测量延迟的数据库操作时,甚至不用担心会花费几纳秒的性能。

你应该担心的是语义,而不是表现。这个问题归结为“只读,不变或两者都没有?”

正确获取语义。 “只读”字段表示“每次执行该程序时该字段只改变一次”,从null到其值。 “const”字段表示“此值永远不会改变,现在不会改变,不会在下一个版本中,永远不会,始终保持不变。”普通字段可以随时改变值。

只读字段就像版本号。它随着时间的推移而变化,但不会改变程序的执行。常数就像pi,或铅的原子序数;它是固定的,永恒的,永不改变的。普通的领域对于在程序过程中发生变化的东西是有利的,比如黄金的价格。你的查询是什么样的?它会在整个程序过程中保持不变,一直保持不变,还是一直不变?

答案 1 :(得分:9)

您应根据使用字符串的代码选择访问修饰符(publicinternal)。

  • static const是编译错误。

  • static readonly字段是普通字段,无法在静态字符集后设置。

  • 在编译时,const string将被其文字值替换 因此,它会提供稍好的性能(因为运行时不使用该字段) 但是,由于它在编译时被替换,因此在一个程序集中定义的任何更改都不会被其他程序集拾取,直到它们全部重新编译。

如果您的代码仅用于一个程序集,您也可以使用const字符串 但是,如果您的字符串被其他程序集使用(或将来可能会使用),则应使用static readonly字符串来保持可维护性。

另请注意,const字符串是编译时常量 如果您需要在字符串中添加机器名称或用户名等内容,则需要将其设为static readonly

答案 2 :(得分:7)

在const vs static readonly上:
const可以有更好的性能,因为它是一个编译时常量 但另一方面,它存在二进制版本问题。常量内联到使用它的程序集中,因此如果声明它的程序集发生更改,则需要重新编译其他程序集,否则它将使用过时的常量。

对于结构我通常使用静态属性而不是只读字段,因为抖动可以优化它,但我仍然没有版本问题。

答案 3 :(得分:3)

纵向公共静态字符串公共const字符串之间的差异可以忽略不计。

在IL中,这是

之间的区别
ldsfld someaddr.field 

ldstr "your const here"

这就是答案。通过使用const,你每次使用它时都会使你的程序集使用该文字,因此程序集将与这些文字一起使用。对于静态,它将是指向中心位置的“指针”。

最大的问题在于:你不能对静态字符串执行开关案例,但你可以反对const(你应该这样做)。

所以,我对此有所了解:如果你需要使用开关 - 你必须使用const;如果你不这样做 - 我会非常依赖静态。

HTH

尼古拉

答案 4 :(得分:0)

鉴于您使用的是Visual Studio,使用public const而不是public static readonly的一个小好处是可以使用智能感知功能来达到峰值"在const值。

e.g。 给出:

public class Constants
{
     public const string ConstString = "Visible!";
     public static readonly string StaticReadonlyString = "Invisible!";
}

hovering over a string that's a constant hovering over a string variable that's static readonly