Когда лучше использовать @ перед строкой? - PullRequest
4 голосов
/ 30 апреля 2011

В коде, который объявляет или использует string, я обычно вижу, что разработчики объявляют это так:

string randomString = @"C:\Random\RandomFolder\ThisFile.xml";

Вместо:

string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml";

Это единственное, чтоЯ вижу, какой лучше использовать префикс @, поскольку вам не нужно делать \\, но есть ли другое применение для него, когда это лучше, чем просто без него?

Ответы [ 5 ]

8 голосов
/ 30 апреля 2011

Знак @ указывает компилятору, что строка является буквальным строковым литералом и, следовательно, не требует экранирования каких-либо символов.Не только обратная косая черта, конечно.Компилятор не обрабатывает escape-последовательности любого вида.

Вопрос «лучше» или нет - очень сложный вопрос.Это чисто стилистический выбор.Некоторые могут утверждать, что содержимое строки более читаемо , когда вы используете строковый литерал, а не экранируете все символы.Другие могут предпочесть консистентность , где все строки, содержащие символы, которые обычно требуют экранирования, должны быть экранированы.Это позволяет сразу заметить ошибки в коде.(Для чего бы это ни стоило, я попадаю в последний лагерь. Все мои пути имеют \\.)

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

5 голосов
/ 30 апреля 2011

Имена путей Windows - не единственные вещи с множеством обратных косых черт. Например, @ -strings очень полезны для регулярных выражений, потому что они избегают двойного экранирования всего.

Они также могут занимать несколько строк, поэтому, если вам когда-нибудь понадобится иметь многострочные строки в коде, они сделают его немного более удобным.

1 голос
/ 30 апреля 2011

Это особенно полезно для регулярных выражений, которые включают явное сопоставление символа обратной косой черты. Поскольку это специальный символ как в синтаксисе строк C #, так и в синтаксисе регулярных выражений, он требует "двойного экранирования". Пример:

string regex = "\\\\.*\\.jpg"

То же выражение с использованием @ -notation будет более аккуратным:

string regex = @"\\.*\.jpg"
1 голос
/ 30 апреля 2011

делает Regex проще

@"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

Строка из нескольких строк

string s = @"testing
some

string with multiple
lines";
0 голосов
/ 16 октября 2013

"" и @ "" являются строковыми литералами, первый - обычным литералом, но последний - дословным строковым литералом '@' перед любой строкой в ​​C # .NET (Обычный строковый литерал и строковый литерал в C #.NET)

...