是逐字还是逃避在C#中处理引用丰富的字符串的首选方法?

B. *_*non 3 c# string escaping zebra-printers verbatim-string

逃避或逐字逐句,这是我的问题.

我需要以编程方式将一些命令发送到C#中的(Zebra QLn220)打印机,具体如下:

! U1 setvar "power.dtr_power_off" "off"
Run Code Online (Sandbox Code Playgroud)

-和:

! U1 setvar "media.sense_mode" "gap"
Run Code Online (Sandbox Code Playgroud)

由于这些命令中有过多的引号,我认为使用逐字字符串是明智的.但基于,我仍然需要加倍引号,因此它可能/理论上需要像:

string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off"""";
Run Code Online (Sandbox Code Playgroud)

......看起来像是由Don King,Coding HorrorGroucho Marx组成的混搭.

以这种方式逃避引号会更好吗:

string dontShutErOff = "! U1 setvar \"power.dtr_power_off\" \"off\"";
Run Code Online (Sandbox Code Playgroud)

我应该逃离Verbatimtraz吗?

UPDATE

基于Eric Lippert的第一个建议,如何:

const string quote = "\"";
string whatever = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 5

资源可能是更好的方法 - 看起来你计划让C#常量具有名称.让资源自动生成为你创建C#常量,同时将命令编辑为常规文本.


Eri*_*ert 5

我会考虑第三种选择:

const string quote = "\"";
string whatever = "! U1 setvar " + 
                  quote + "power.dtr_power_off" + quote + " " +
                  quote + "off" + quote;
Run Code Online (Sandbox Code Playgroud)

或者第四个:

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

所有这些都有利有弊; 没有一个是最好的.

  • @asawyer使变量`const`意味着编译器将进行直接的源内替换,此时编译器的常量折叠逻辑将确保最终字符串在编译时完全形成,而不是强制运行时级联. (4认同)