2015-06-11 2 views
9

Я пришел через некоторый код во время кодового обзора, где старый Коллега сделал следующее:Пустая строка литералов

const string replacement = @""; 

Эта строка используется в регулярное выражение в качестве замены, что соответствует. Мой вопрос заключается в том, что является целью добавления символа @ literal в начало пустой строки. Не должно быть ничего, чтобы буквально интерпретировать.

Будет ли разница в ударе между: @""; и "";?

+0

Почему бы просто не попробовать сравнить два кода. – Paparazzi

+0

В отладчике нет разницы, я задавался вопросом о любых других различиях, которые потенциально могут носить более теоретический характер. – FiringSquadWitness

+0

@Blam Это не всегда так просто ... например. попробуйте это «decimal x = 0.0m; десятичный y = 0,00m; Console.Write ("{0}, {1}, {2}", x, y, x == y); ' – DavidG

ответ

4

Ниже:

string a = @""; 
string b = ""; 

Формирует этот IL:

IL_0001: ldstr  "" 
IL_0006: stloc.0  // a 
IL_0007: ldstr  "" 
IL_000C: stloc.1  // b 

Так нет, нет никакой разницы.

5

Посмотрите на MSDN documention for string literals. Для пустой строки она не действует, однако она изменяет поведение определенных последовательностей escape-символов, а также обработку новой строки. Примеры, взятые с сайта MSDN:

string a = "hello, world";     // hello, world 
string b = @"hello, world";    // hello, world 
string c = "hello \t world";    // hello  world 
string d = @"hello \t world";    // hello \t world 
string e = "Joe said \"Hello\" to me";  // Joe said "Hello" to me 
string f = @"Joe said ""Hello"" to me"; // Joe said "Hello" to me 
string g = "\\\\server\\share\\file.txt"; // \\server\share\file.txt 
string h = @"\\server\share\file.txt";  // \\server\share\file.txt 
string i = "one\r\ntwo\r\nthree"; 
string j = @"one 
two 
three"; 
9

Эта строка используется в регулярное выражение

Регулярные выражения делают интенсивное использование \ характера. Например, следующее регулярное выражение, чтобы соответствовать precentages из 0 в 100, что всегда есть четыре знака после запятой:

^(100\.0000|[1-9]?\d\.\d{4})$ 

Поскольку \ должен быть экранированы в более общей C# синтаксис для \\@"" форма позволяет регулярное выражение, чтобы быть более легко читать, сравнивать:

"^(100\\.0000|[1-9]?\\d\\.\\d{4})$" 
@"^(100\.0000|[1-9]?\d\.\d{4})$" 

И по этой причине люди часто попадают в привычку использовать @"" формы, когда они используют регулярные выражения, даже в тех случаях, когда это не имеет никакого диффере се. Во-первых, если они потом перейдут на что-то, что имеет значение только для изменения выражения, а не для кода самой строки.

Я бы предположил, что это вероятно, почему ваш коллега использовал @"", а не "" в данном конкретном случае. Производимые .NET одинаковы, но они используются для использования @"" с регулярными выражениями.

Смежные вопросы