我应该使用字符串常量还是字符串字面值?

7
默认情况下,当我有一串将通过消息框、标签等输出到屏幕的文本时,我在我的代码中使用字符串常量。我这样做的主要原因是我不希望这些字符串在运行时更改,这样就不会有人真正接触到它们。
我的问题是:
从内存的角度来看,这种方法似乎会创建一个由GB决定生命周期的对象,而字符串字面值似乎更有效,并且会更快地被处理。我知道这是个新手问题,但使用字面值比常量有益处(无论多么微小),还是应该在这种情况下使用常量?
我知道这不会对我的应用程序产生任何显著的影响,但我正在努力改进自己作为开发人员的能力,并建立保持合理时间的标准。 :o)

也许我的英语不够好,但“字符串常量”和“字符串字面值”的区别是什么?它们不是一样的吗? - Remko Jansen
1
字符串字面量是引号之间的部分(“foo”)。常量是当您将字面值分配给名称时(const string FOO =“foo”)。我认为当Jason说字面量时,他指的是在行内使用字面量(MessageBox.Show(“foo”))。 - Rob Fonseca-Ensor
5个回答

14

不是两者。据我所知,推荐的方式是使用资源文件。


我同意。忘记字面量和常量。一定要使用资源文件。这样字符串会被保留在外部并且是与语言无关的。 - Simon P Stevens
当然,这取决于上下文。无需进行软编码:http://en.wikipedia.org/wiki/Softcoding =) - Chris Cooper

5

更倾向于使用字符串常量而不是字符串字面量,但这样做的原因是为了使您的代码更易于维护,而不是为了提高其性能。


1
Amen。可维护性的回报将比OP提出的微观优化高十倍。 - JohnFx
@BilltheLizard 使用字符串常量比使用字符串字面量更易维护的原因是什么? - undefined
1
@MehdiCharife 使用任何常量的方式比使用字面值更易维护。如果你的代码中有多个相同的字面值副本,当值需要更改时,你就需要在多个地方进行更改。而如果你定义一个常量,你只需要在一个地方进行更改。 - undefined

3
你应该了解 "字符串驻留"。基本上,任何源文件中的唯一字符串字面量(常量或内联)都将存储在一个特殊表中。它们永远不会被垃圾回收,并且可能受益于重复使用。
如果你想更改这些字符串而不想重新编译(例如用于国际化),你可能需要考虑使用资源文件。

2
字符串驻留的要点是,你应该做最易于维护的事情。 - Rob Fonseca-Ensor
我相信在C# 4.0中字符串内联是默认的。我认为编译器也会在代码中插入文字常量(和枚举)。这意味着将常量与其实现分离可能会导致版本问题。我同意Rob上面的观点,应该做最可维护的事情,但不要将此语句限制在字符串内联上。 - Sprague

1
为了国际化的目的,被广泛接受的最佳实践/建议是一组资源文件。
我采用了使用字符串常量的相同模式。我发现创建将在整个Web应用程序的多个页面上使用的常量更容易。即使是带有占位符的常量也很有帮助!
  //{1} for the user's full name for example
const string SOME_LABEL = "Thanks for purchasing {0} products, {1}!";

1

这取决于您是否需要将这些字符串本地化。如果您需要将软件翻译成其他语言的能力,则应将尽可能多的显示给最终用户的字符串放在资源文件中。如果您不需要本地化,或者所讨论的字符串从未显示给最终用户,则应使用常量。如果您的字符串在多个类之间共享,则应创建包装公共字符串的类,并提供公共常量。除非这些字符串需要在定义它们的程序集之外使用,否则请将它们保持在最低权限级别(私有、受保护、内部)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接