Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,逐字或转义是处理引号丰富字符串的首选方法吗?_C#_String_Escaping_Zebra Printers_Verbatim String - Fatal编程技术网

在C#中,逐字或转义是处理引号丰富字符串的首选方法吗?

在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""""; …看起来像是由、和组

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

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

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