4

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

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
}

:)

4

3 回答 3

5

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

通常,这意味着使用 是为了在您的方法const string中不出现魔法值。Foo如果常量只使用一次,这听起来可能不太令人信服,但如果将来甚至有可能多次使用它,那么DRY几乎是一个霰弹枪的论据。

更新:

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

于 2013-03-14T10:59:10.700 回答
3

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

于 2013-03-14T10:58:48.997 回答
0

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

(2) 不要公开披露内容。改为使用属性。(特别是关于字符串。)

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

有关该点的更多讨论,请参见此处:

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

于 2013-03-14T11:03:34.637 回答