首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声明字符串public static readonly与public const还是public static const

声明字符串public static readonly与public const还是public static const
EN

Stack Overflow用户
提问于 2010-12-10 04:13:34
回答 5查看 18.6K关注 0票数 35

在我们拥有的每个项目中,都有一个文件用于存储该项目中使用的各种SQL语句。关于类的声明方式和字符串的声明方式,有几个变体。

示例类声明:

代码语言:javascript
复制
internal sealed class ClassName
internal static class ClassName
public sealed class ClassName
public static class ClassName
internal class ClassName

字符串声明示例:

代码语言:javascript
复制
internal const string stringName
internal static string stringName
public static readonly string stringName
public static string stringName
public const string stringName

我不明白不同声明之间的性能含义是什么。对于这种情况/场景,有没有最佳实践?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-10 05:03:12

我不明白不同声明之间的性能含义

评估数据库查询的成本可能是数百万数十亿,乘以从常量更改为只读字段或从常量更改为只读字段的成本差异。当数据库操作的延迟以毫秒为单位时,甚至不用担心需要几纳秒的性能。

你应该担心的是语义,而不是性能。这个问题可以归结为“只读、常量还是两者都不?”

获得正确的语义。"readonly“字段表示”每次执行此程序时,此字段恰好更改一次“,从null变为其值。"const“字段表示”这个值永远不会改变,现在不会,下一个版本也不会,永远不会,它在所有时间中都是常量。“普通字段可以随时更改值。

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

票数 85
EN

Stack Overflow用户

发布于 2010-12-10 04:17:14

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

  • static const是一个编译器错误。
  • A static readonly字段是一个普通字段,不能在静态ctor之后设置。
  • A const string将在编译时被其文字值替换。

因此,它将提供稍微更好的性能(因为运行时不使用该字段)。

但是,因为它在编译时被替换,所以对一个程序集中的定义所做的任何更改都不会被其他程序集采用,直到它们全部重新编译。

如果您的代码仅在一个程序集中使用,则还不如使用const字符串。

但是,如果您的字符串由其他程序集使用(或将来可能使用),则应使用static readonly字符串以实现可维护性。

还要注意,const字符串是编译时常量。

如果您需要在字符串中包含机器名或用户名等内容,则需要将其设置为static readonly

票数 9
EN

Stack Overflow用户

发布于 2010-12-10 04:21:00

在const vs static readonly上:

常量可以有更好的性能,因为它是一个编译时间常量

但另一方面,它在二进制版本控制方面存在问题。常量被内联到使用它的程序集中,因此如果声明它的程序集发生更改,另一个程序集需要重新编译,否则它将使用过时的常量。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4402690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档