Const字符串字段vs "type "字符串
本文关键字:quot 字符串 type vs 字段 Const | 更新日期: 2023-09-27 18:03:57
我有一个这样的小函数:
void Bar(string s)
{
*/ do somthing with the string here.*/
}
void Foo()
{
Bar("Hello");
}
如果我看一下IL输出,它给了我以下内容:
.method private hidebysig instance void Foo() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldstr "Hello"
L_0006: call instance void TestApp.MainWindow::Bar(string)
L_000b: ret
}
现在我想我应该用const string
字段替换它。
const string str= "Hello";
void Foo()
{
Bar(str);
}
将转换为完全相同的 IL代码段。
现在我的问题是使用哪一个?
Foo("Hello");
或Foo(cHello);
谢谢你的帮助!
-------------- 编辑 -------------------
更具体地说,我使用这个用于日志目的,为消息添加前缀:而且它只会在代码中出现一次!
所以它看起来更像这样:
void LogDebug(string msg)
{
Log("[DEBUG]", msg)
}
void Log(string pre, string msg)
{
// generates an output in form of
// pre + msg
}
:)
答案应该是显而易见的:既然IL是相同的,那么基于纯粹的源代码考虑,使用最有效的方法。
一般来说,这意味着使用const string
,以便在Foo
方法中不会出现一个神奇的值。如果常量只使用一次,这听起来可能不太令人信服,但如果将来甚至有可能使用不止一次,那么DRY几乎就是一个shotgun参数。
更新:
在这个特定的情况下(调试输出,常量保证只使用一次),我不认为常量提供任何值。我将硬编码字符串字面值
const
在编译时被替换。最好使用const
字符串而不是硬编码字符串,因为它使它们易于维护。
(1)在私有代码或内部代码中使用const string,如果这样可以使代码更具可读性,或者您可以多次使用相同的字符串。
(2)不要公开const。使用属性代替。(特别是对于字符串)
这样做的原因是它将const紧密地绑定到引用它的程序集中。
请参阅此处查看关于这一点的更多讨论:
https://softwareengineering.stackexchange.com/questions/132747/is-having-public-constants-bad