3

逃げるか、一言一句言うか、それが私の質問です。

具体的には、C# で (Zebra QLn220) プリンターにいくつかのコマンドをプログラムで送信する必要があります。

! U1 setvar "power.dtr_power_off" "off"

-と:

! U1 setvar "media.sense_mode" "gap"

これらのコマンドには大量の引用符が含まれているため、逐語的な文字列を使用するのが賢明だと思いました。しかし、これに基づいて、引用符を2倍にする必要があるため、おそらく/理論的には次のようにする必要があります。

string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off"""";

...これは、コーディング ホラーの猫であるドン キンググルーチョ マルクスを組み合わせたマッシュアップのように見えます。

この方法で引用符をエスケープする方が良いでしょうか:

string dontShutErOff = "! U1 setvar \"power.dtr_power_off\" \"off\"";

?

Verbatimtraz から逃れる必要がありますか?

アップデート

Eric Lippert の最初の提案に基づいて、これはどうですか:

const string quote = "\"";
string whatever = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
4

4 に答える 4

5

私は3番目の選択肢を検討します:

const string quote = "\"";
string whatever = "! U1 setvar " + 
                  quote + "power.dtr_power_off" + quote + " " +
                  quote + "off" + quote;

または4番目:

static string Quote(string x) 
{
    const string quote = "\""; 
    return quote + x + quote;
}
...
string whatever = "! U1 setvar " + Quote("power.dtr_power_off") + " " + Quote("off");

これらにはすべて長所と短所があります。どれも明らかに最高です。

于 2014-04-18T18:11:41.507 に答える
5

リソースの方がより良いアプローチかもしれません-とにかくC#定数に名前を付けることを計画しているようです。コマンドを通常のテキストとして編集しているときに、リソースの自動生成でC#定数を作成してください。

于 2014-04-18T16:46:33.960 に答える
2

最初の例で説明したように、逐語的な文字列では二重引用符を使用できません。コンパイルされません。

私は実際にこれを発見しました...引用符として二重引用符をサポートしています。したがって、最初の例は次のようになります。

string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";

ただし、文字列リテラルが重要な場合、変更される可能性が低い場合、または将来翻訳する必要がある場合は、前の回答で述べたようにリソース ファイルに配置します。エスケープは自動的に行われ、文字列は簡単に読み取れます。

于 2014-04-18T16:46:53.040 に答える
1

最初の行は次のようになります。

string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";

引用符は、三重引用符ではなく、二重引用符として記述されます。

少なくとも引用符に関しては、どちらの方法も明らかに優れています。それは主に好みの問題です。他の状況では、バックスラッシュを含むファイル パスに @ で区切られた文字列を使用するなど、いずれかの方法に明らかな利点があります。

于 2014-04-18T16:55:12.863 に答える