我有一个像这样的小功能:
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
}
:)
答案 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