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

ご協力ありがとうございました!

--------------編集--------------------
より具体的には、これをロギングの目的で使用して、プレフィックスを追加しますメッセージ: コード内で 1 回だけ表示されます。

したがって、次のようになります。

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はほとんどショットガンの議論です。

アップデート:

この特定のケース(デバッグ出力、定数は1回だけ使用されることが保証されています)では、定数が値を提供するとは思いません。文字列リテラルをハードコーディングします。

于 2013-03-14T10:59:10.700 に答える
3

constコードのコンパイル時に置き換えられます。constハードコードされた文字列の代わりに文字列を使用すると、保守が容易になるため 、より適切です。

于 2013-03-14T10:58:48.997 に答える
0

(1) コードを読みやすくする場合、または同じ文字列を複数回使用する場合は、プライベート コードまたは内部コードに const 文字列を使用します。

(2) const を公に公開しないでください。代わりにプロパティを使用してください。(特に弦に関して。)

その理由は、const をそれを参照するアセンブリにしっかりとバインドするためです。

その点に関する詳細については、こちらを参照してください。

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

于 2013-03-14T11:03:34.637 に答える