在C#中,逐字或转义是处理引号丰富字符串的首选方法吗?
逃避还是逐字逐句,这是我的问题 我需要以编程方式向C#中的(Zebra QLn220)打印机发送两个命令,具体如下:在C#中,逐字或转义是处理引号丰富字符串的首选方法吗?,c#,string,escaping,zebra-printers,verbatim-string,C#,String,Escaping,Zebra Printers,Verbatim String,逃避还是逐字逐句,这是我的问题 我需要以编程方式向C#中的(Zebra QLn220)打印机发送两个命令,具体如下: ! U1 setvar "power.dtr_power_off" "off" -以及: 由于这些命令中有过多的引号,我认为使用逐字字符串是明智的。但基于此,我仍然需要将引号加倍,以便推测/理论上需要如下: string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off""""; …看起来像是由、和组
! U1 setvar "power.dtr_power_off" "off"
-以及:
由于这些命令中有过多的引号,我认为使用逐字字符串是明智的。但基于此,我仍然需要将引号加倍,以便推测/理论上需要如下:
string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off"""";
…看起来像是由、和组成的mashup
这样做是否更好:
string dontShutErOff = "! U1 setvar \"power.dtr_power_off\" \"off\"";
?
我应该逃避逐字逐句的批评吗
更新
根据Eric Lippert的第一个建议,这个怎么样:
const string quote = "\"";
string whatever = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
参考资料可能是更好的方法-看起来您计划使用C#常量来命名。让资源自动生成为您创建C#常量,同时将命令编辑为常规文本。逐字字符串不允许使用双引号,如您在第一个示例中所述。它不会编译 我只是发现了这个事实。。。它确实支持双引号作为引号。因此,您的第一个示例如下所示:
string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";
但是,如果字符串文字很重要,不太可能更改,或者将来可能需要翻译,我会将它们放在一个资源文件中,如前一个答案中所述。任何转义都是自动完成的,字符串很容易读取。您的第一行应该是:
string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";
引号是双引号,而不是三引号
这两种方法显然都不比另一种好,至少引号是这样。这主要是口味的问题。在其他情况下,一种方式或另一种方法具有明显的优点,例如,使用包含反斜杠的文件路径的@分隔字符串。 < P>我将考虑第三种备选方案:
const string quote = "\"";
string whatever = "! U1 setvar " +
quote + "power.dtr_power_off" + quote + " " +
quote + "off" + quote;
或者第四个:
static string Quote(string x)
{
const string quote = "\"";
return quote + x + quote;
}
...
string whatever = "! U1 setvar " + Quote("power.dtr_power_off") + " " + Quote("off");
这些都有利弊,;没有一个是最好的。谢谢;顺便问一下,你的名字是斯科特·坎贝尔还是斯坎普·贝尔?没问题。堆栈溢出用户的配置文件部分包含名称和其他类似信息。不过你更接近第一个:)你的个人资料上只写着“小淘气”,所以…这是个问题;-)很高兴知道。我以为这一切都是公开的。山姆·坎贝尔。正确转义更重要:逐字逐句地说,
“
”,而不是”
,是“
”的转义版本。2票赞成,3票反对;这似乎是一种奇怪的并置方式,它建议使用一种方法来处理这样的用例。我认为目前的任何一种方法都不令人满意;但是对于两个人来说,使用资源字符串就像是打领带一样。在quote
变量上加const
的原因是什么?我可以看到它生成了不同的IL代码,然后是一个非常量字符串变量,但我不知道为什么或者区别是什么。你觉得我对你的第一个想法如何(在我上面的更新中)?@asawyer使变量const
意味着编译器将直接进行源代码替换,此时,编译器的常量折叠逻辑将确保最终字符串在编译时完全形成,而不是强制运行时串联。
static string Quote(string x)
{
const string quote = "\"";
return quote + x + quote;
}
...
string whatever = "! U1 setvar " + Quote("power.dtr_power_off") + " " + Quote("off");