3

逃避还是逐字逐句,这是我的问题。

我需要以编程方式向 C# 中的(Zebra QLn220)打印机发送几个命令,具体来说:

! U1 setvar "power.dtr_power_off" "off"

-和:

! U1 setvar "media.sense_mode" "gap"

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

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

...看起来像是由Don KingCoding Horror 中的猫Groucho Marx组成的混搭。

以这种方式转义引号会更好:

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

4 回答 4

5

资源可能是更好的方法 - 看起来您打算让 C# 常量无论如何都有名称。让资源自动生成为您创建 C# 常量,同时将命令编辑为常规文本。

于 2014-04-18T16:46:33.960 回答
5

我会考虑第三种选择:

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

所有这些都有优点和缺点;没有一个显然是最好的。

于 2014-04-18T18:11:41.507 回答
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 回答