const字符串字段vs“typed”字符串

时间:2013-03-14 10:57:04

标签: c# string parameters const function-calls

我有一个像这样的小功能:

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);

感谢您的帮助!

-------------- EDIT -------------------
更具体地说,我将此用于记录目的,为消息添加前缀: 它只会在代码中出现一次!

所以看起来更像是这样:

void LogDebug(string msg)
{
    Log("[DEBUG]", msg)
}
void Log(string pre, string msg)
{
    // generates an output in form of
    // pre + msg
}

:)

3 个答案:

答案 0 :(得分:5)

答案应该是显而易见的:因为IL是相同的,所以根据纯粹的源代码考虑使用最好的方法。

通常,这意味着使用const string,以便在Foo方法中不显示魔术值。如果只使用常数这可能听起来不太令人信服,但如果将来有可能不止一次使用它,那么DRY几乎就是一个霰弹枪的论点。

<强>更新

在这种特定情况下(调试输出,常量保证只使用一次)我不认为常量提供任何值。我会对字符串文字进行硬编码。

答案 1 :(得分:3)

const在编译时在代码中被替换。如果使用const字符串而不是硬编码字符串会更好,因为它使它们易于维护。

答案 2 :(得分:0)

(1)对于私有或内部代码使用const字符串,如果它会使代码更具可读性,或者你将多次使用相同的字符串。

(2)不要公开传播CONSTS。请改用属性。 (特别是关于琴弦。)

原因是它将const紧紧绑定到引用它的程序集中。

有关这一点的更多讨论,请参阅此处:

https://softwareengineering.stackexchange.com/questions/132747/is-having-public-constants-bad