У мене є пробна версія Resharper, і вона завжди пропонує переключити звичайні рядки до дослівних рядків. Яка різниця?
У мене є пробна версія Resharper, і вона завжди пропонує переключити звичайні рядки до дослівних рядків. Яка різниця?
Відповіді:
Дослідний рядок - це той, який не потрібно уникати, як-от ім’я файлу:
string myFileName = "C:\\myfolder\\myfile.txt";
було б
string myFileName = @"C:\myfolder\myfile.txt";
Символ @ означає читати цей рядок буквально і не інтерпретувати контрольні символи інакше.
Це розглянуто в розділі 2.4.4.5 специфікації C # :
2.4.4.5 Рядки-рядки
C # підтримує дві форми рядкових літералів: звичайні рядкові літерали та дословні рядкові літерали.
Звичайний літеральний рядок складається з нуля або більше символів, укладених у подвійні лапки, як у "привіт", і може включати в себе як прості послідовності втечі (такі як \ t для символу вкладки), так і шістнадцятковий і Unicode послідовності втечі.
Дослівний рядковий літерал складається з символу @, який супроводжується символом подвійної лапки, нулем або більше символів та символом подвійної цитати. Простий приклад - @ "привіт". У дослівному рядковому рядковому рядку символи між роздільниками інтерпретуються дослівно, єдиним винятком є послідовність цитата-втечі. Зокрема, прості послідовності втечі та шістнадцяткові та послідовні відхилення Unicode не обробляються у дослівно-рядкових літералах. Дослівний рядковий літерал може охоплювати кілька рядків.
Іншими словами, єдиним спеціальним символом у дословному рядковому рядку @ є символ подвійного цитування. Якщо ви хочете написати дословний рядок, що містить подвійну цитату, ви повинні написати дві подвійні лапки. Всі інші символи трактуються буквально.
Ви можете навіть мати буквальні нові рядки у дослівному рядку. У звичайному рядковому літералі ви не можете мати літеральні нові рядки. Натомість ви повинні використовувати, наприклад "\n"
.
Дослівні рядки-літерали часто корисні для вбудовування назви файлів і регулярних виразів у вихідний код, оскільки зворотні риски в цих типах рядків є загальними і їх потрібно уникати, якби використовувався звичайний літеральний рядок.
Немає різниці під час виконання між рядками, створеними з звичайних літеральних рядків, і рядками, створеними з дослівних рядкових літералів - вони обоє типу System.String
.
Немає різниці у виконанні між рядком та строковим рядком. Вони різні лише під час компіляції. Компілятор приймає меншу кількість послідовностей евакуації у дослівному рядку, тому що, що ви бачите, є, що ви отримуєте, окрім втечі цитати.
Ви також можете використовувати дослівний символ @, щоб сказати компілятору, щоб розглянути ключове слово як ім'я:
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);
Ви також можете мати багаторядкові рядки, використовуючи дослідні рядки:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
без @
вас помилка
У VB14 є нова функція, яка називається Multiline Strings
, це як дослівні рядки в C #.
Підказка: літературні рядки VB тепер точно схожі на C # дослідні рядки.
У звичайних рядках використовуються спеціальні послідовності евакуації для перекладу на спеціальні символи.
/*
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\\.");