Является ли Verbatim или выход из предпочтительного способа работы со строками, обогащенными кавычками, в C#?
Чтобы избежать или дословно, это мой вопрос.
Мне нужно программно отправить пару команд на принтер (Zebra QLn220) в C#, а именно:
! U1 setvar "power.dtr_power_off" "off"
-а также:
! U1 setvar "media.sense_mode" "gap"
Из-за обилия кавычек в этих командах я подумал, что было бы разумно использовать дословные строки. Но исходя из этого, мне все еще нужно удвоить кавычки, чтобы предположительно / теоретически это было бы примерно так:
string dontShutErOff = @"! U1 setvar """power.dtr_power_off""" """off"""";
... который выглядит как мэшап, состоящий из дона Кинга, кота из Coding Horror и Граучо Маркса.
Было бы лучше избежать кавычек таким образом:
string dontShutErOff = "! U1 setvar \"power.dtr_power_off\" \"off\"";
?
Должен ли я сбежать от Verbatimtraz?
ОБНОВИТЬ
Основываясь на первом предложении Эрика Липперта, как насчет этого:
const string quote = "\"";
string whatever = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
4 ответа
Я бы рассмотрел третий вариант:
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");
Все они имеют свои плюсы и минусы; никто не является явно лучшим.
Ресурсы могут быть лучшим подходом - похоже, вы планируете иметь константы C#, чтобы в любом случае иметь имена. Пусть автоматическая генерация ресурса создаст для вас константу C# при редактировании команд в виде обычного текста.
Строковые строки не допускают двойных кавычек, как вы описали в первом примере. Это не скомпилируется.
Я только что выяснил это на самом деле... Он поддерживает двойные двойные кавычки как кавычки. Итак, ваш первый пример будет выглядеть так:
string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";
Однако, если ваши строковые литералы важны, вряд ли изменятся или, возможно, потребуется их перевод в будущем, я бы поместил их в файл ресурсов, как упоминалось в предыдущем ответе. Любое экранирование выполняется автоматически, и строка легко читается.
Ваша первая строка должна быть:
string dontShutErOff = @"! U1 setvar ""power.dtr_power_off"" ""off""";
Кавычки пишутся как двойные кавычки, а не как тройные.
Ни один из способов явно не лучше другого, по крайней мере, для кавычек. Это в основном дело вкуса. В других ситуациях тот или иной способ имеет явные преимущества, например, использование строки с разделителями @ для путей к файлам, которые содержат обратную косую черту.