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
}

:)

Const字符串字段vs "type "字符串

答案应该是显而易见的:既然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