Чим відрізняється звичайний рядок від дослівного рядка?


166

У мене є пробна версія Resharper, і вона завжди пропонує переключити звичайні рядки до дослівних рядків. Яка різниця?


3
Я ніколи не бачив цієї пропозиції від ReSharper. Чи можете ви навести приклад, де це пропонує?
Джон Сондерс

3
Я щойно це отримав. Перша пропозиція полягала в тому, щоб перенести його на ресурс, а друга - зробити його дослівною рядком: MessageBox.Show ("Платиноса потрібно погладити, перш ніж робота може продовжуватися.");
Б. Клей Шеннон

Я все ще отримую це весь час. Це, як правило, одне з попереджувальних попереджень, яке ви хочете вимкнути, оскільки воно пропонує робити рядки дослівно без будь-якої причини.
Dean Swiatek

Якщо вам подобається моя запропонована функція для Visual Studio IDE, будь ласка, опублікуйте тут: developercommunity.visualstudio.com/idea/602807/…
Олів'є

Відповіді:


191

Дослідний рядок - це той, який не потрібно уникати, як-от ім’я файлу:

string myFileName = "C:\\myfolder\\myfile.txt";

було б

string myFileName = @"C:\myfolder\myfile.txt";

Символ @ означає читати цей рядок буквально і не інтерпретувати контрольні символи інакше.


12
Цікаво, чому Решарпер пропонує цю зміну. Чи знають будь-які гуру CLR, чи дослідницькі рядки обробляються ефективніше, оскільки символи втечі можуть ігноруватися?
Метт Петерсон

9
Я думаю, можливо, ReSharper пропонує це, тому що дослівна рядок є більш читабельною.
andyp

36
Я вважаю, що це своєрідна умова кодування (я ніколи не бачив і не чув). Для рядків ReSharper пропонують або перемістити його у файл ресурсу для локалізації, або зробити його дослівним - для дослідних рядків ReSharper вже не пропонує можливості локалізувати рядок. Тож здається умовою зробити всі рядки, які не потребують локалізації, дослівно.
Даніель Брюкнер

Скажімо, у нас є рядковий літерал, призначений змінній рядка, рядок myFileName = "C: \\ myfolder \\ myfile.txt"; Тепер я хочу перетворити строкову змінну myFileName у дослівну строку. Як це зробити? Це працює? string verbatimStr = @myFileName;
sanjeev bhusal

3
@sanjeevbhusal: Ти насправді так не робиш. @ "C: \ myfolder \ myfile.txt" та "C: \\ myfolder \\ myfile.txt" - це одне і те саме для CLR. Це в основному синтаксичний цукор.
alc6379

68

Це розглянуто в розділі 2.4.4.5 специфікації C # :

2.4.4.5 Рядки-рядки

C # підтримує дві форми рядкових літералів: звичайні рядкові літерали та дословні рядкові літерали.

Звичайний літеральний рядок складається з нуля або більше символів, укладених у подвійні лапки, як у "привіт", і може включати в себе як прості послідовності втечі (такі як \ t для символу вкладки), так і шістнадцятковий і Unicode послідовності втечі.

Дослівний рядковий літерал складається з символу @, який супроводжується символом подвійної лапки, нулем або більше символів та символом подвійної цитати. Простий приклад - @ "привіт". У дослівному рядковому рядковому рядку символи між роздільниками інтерпретуються дослівно, єдиним винятком є ​​послідовність цитата-втечі. Зокрема, прості послідовності втечі та шістнадцяткові та послідовні відхилення Unicode не обробляються у дослівно-рядкових літералах. Дослівний рядковий літерал може охоплювати кілька рядків.

Іншими словами, єдиним спеціальним символом у дословному рядковому рядку @ є символ подвійного цитування. Якщо ви хочете написати дословний рядок, що містить подвійну цитату, ви повинні написати дві подвійні лапки. Всі інші символи трактуються буквально.

Ви можете навіть мати буквальні нові рядки у дослівному рядку. У звичайному рядковому літералі ви не можете мати літеральні нові рядки. Натомість ви повинні використовувати, наприклад "\n".

Дослівні рядки-літерали часто корисні для вбудовування назви файлів і регулярних виразів у вихідний код, оскільки зворотні риски в цих типах рядків є загальними і їх потрібно уникати, якби використовувався звичайний літеральний рядок.

Немає різниці під час виконання між рядками, створеними з звичайних літеральних рядків, і рядками, створеними з дослівних рядкових літералів - вони обоє типу System.String.


27

Немає різниці у виконанні між рядком та строковим рядком. Вони різні лише під час компіляції. Компілятор приймає меншу кількість послідовностей евакуації у дослівному рядку, тому що, що ви бачите, є, що ви отримуєте, окрім втечі цитати.

Ви також можете використовувати дослівний символ @, щоб сказати компілятору, щоб розглянути ключове слово як ім'я:

var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);

var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);

16

Ви також можете мати багаторядкові рядки, використовуючи дослідні рядки:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

без @вас помилка

У VB14 є нова функція, яка називається Multiline Strings, це як дослівні рядки в C #.

Багаторядкові струни

Підказка: літературні рядки VB тепер точно схожі на C # дослідні рядки.


13

У звичайних рядках використовуються спеціальні послідовності евакуації для перекладу на спеціальні символи.

/*
This string contains a newline
and a tab    and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");

Дослідні рядки інтерпретуються так, як є, не перекладаючи жодної послідовності відходу:

/* 
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");

0

Якщо ви хочете видалити попередження Resharper, ви можете використовувати:

Localizable(false)

Для таких речей, як параметри, розташування файлів, наприклад. це може бути хорошим рішенням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.