在C#中处理包含引号的字符串,是采用逐字字符串(Verbatim)还是转义字符的方式更好?

3
我应该使用转义符还是原样输出?这是我的问题。
我需要以C#编程方式向打印机(Zebra QLn220)发送几个命令,具体来说:
! U1 setvar "power.dtr_power_off" "off"

-和:

! U1 setvar "media.sense_mode" "gap"

由于这些命令中有大量引号,我认为使用原样字符串是明智的选择。但基于this,我仍然需要将引号加倍,所以理论上应该像这样:
string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off"""";

...看起来像是由唐·金, Coding Horror的猫格劳乔·马克思组成的混搭。

这样转义引号会更好吗:

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

1
正确转义更为重要:在verbatim中,"""的转义版本,而不是""" - Tim S.
2个赞同和3个关闭投票,这似乎是一个奇怪的并置。 - B. Clay Shannon-B. Crow Raven
1
我建议增加一个功能来处理这种情况。我认为目前的任何方法都不令人满意。 - MgSam
4个回答

5

资源文件可能会更好 - 看起来您打算为C#常量命名。使用资源自动生成为您创建C#常量,而将命令编辑为常规文本。


如果我有很多这样的东西,我想;但对于只有两个的情况,使用资源字符串就像系鞋带时戴领带一样。 - B. Clay Shannon-B. Crow Raven

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

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

const 放在 quote 变量上的原因是什么?我可以看到它生成了不同的 IL 代码,而非 const 字符串变量,但我不确定为什么或者有什么区别。 - asawyer
你认为我在更新中对你的第一次看法怎么样? - B. Clay Shannon-B. Crow Raven
4
将变量声明为const意味着编译器会在源代码中直接进行替换,并且编译器的常量折叠逻辑将确保最终字符串在编译时完全形成,而不是强制运行时拼接。 - dlev

2

字面字符串不允许像你在第一个例子中描述的那样使用双引号。它无法编译。

实际上,我刚发现...它支持使用两个双引号作为引号。所以你的第一个例子应该是这样的:

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

然而,如果你的字符串文字很重要,不太可能改变或可能在将来需要翻译,我建议像之前的答案中提到的那样将它们放入资源文件中。任何转义都会自动完成,并且字符串易于阅读。


谢谢。顺便问一下,你的名字是Scot Campbell还是Scamp Bell? - B. Clay Shannon-B. Crow Raven
1
没问题。Stack Overflow用户有名字和其他信息的个人资料部分。你在第一个问题上更接近了解答案 :) - Scampbell
你的个人资料只是写着“Scampbell”,所以……这确实是个问题;-) - B. Clay Shannon-B. Crow Raven
好的,知道了。我以为所有这些都是公开的。这是Sam Campbell。 - Scampbell

1
你的第一行应该是:

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

引号应该写成双引号,而非三个。
至少在引号的情况下,两种方式都没有明显的优劣之分。这主要是一种口味问题。在其他情况下,其中一种方法具有明显的优势,例如使用@分隔的字符串来表示包含反斜杠的文件路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接