Программирование PC C#: символы @ и $ перед строкой Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


C#: символы @ и $ перед строкой Печать
Добавил(а) microsin   

В языке C# символы @ и $, установленные перед строкой, используются для специальной интерпретации этой строки [1].

[Специальный символ @]

@ в начале строки используется для следующих целей:

1. Чтобы использовать ключевые слова C# в качестве идентификаторов. Символ @ предшествует элементу кода, который компилятор должен интерпретировать как идентификатор, а не ключевое слово C#. Получается тип String, к которому можно применять его методы Format, Length и т. д.

2. Чтобы указать, что строковый литерал следует интерпретировать буквально. Символ @ в этом случае определяет буквальный строковый литерал. Простые escape-последовательности (например, "\\" для обратной косой черты), шестнадцатеричные escape-последовательности (например, "\x0041" для прописной буквы A) и escape-последовательности Юникода (например, "\u0041" для прописной буквы A) интерпретируются буквально.

Исключения составляют только escape-последовательность кавычек ("") и escape-последовательности фигурных скобок, они не интерпретируется буквально.

""    Создает одну двойную кавычку.
{{    Создает одну левую фигурную скобку.
}}    Создает одну правую фигурную скобку.

В следующем примере определяются два идентичных пути к файлам: один с помощью обычного строкового литерала, а другой — с помощью буквального строкового литерала. Это один из наиболее распространенных способов использования буквальных строковых литералов.

string ИмяФайла1 = @"c:\Мои Документы\заметка.txt";
string ИмяФайла2 = "c:\\Мои Документы\\заметка.txt";
 
Console.WriteLine(ИмяФайла);
Console.WriteLine(ИмяФайла);
// Пример выведет следующий текст:
//     c:\Мои Документы\заметка.txt
//     c:\Мои Документы\заметка.txt

В следующем примере показан результат определения обычного строкового литерала и буквального строкового литерала, содержащий идентичные последовательности символов. В первой строке строка1 \", \u, \x обрабатываются как esc-последовательности, (символы текста 'c' и '!' закодированы с беззнаковом и HEX-формате соответственно), а вторая строка строка2 интерпретируется буквально, esc-последовательности игнорируются.

string строка1 = "Он сказал \"This is the last \u0063hance\x0021\"";
string строка2 = @"Он сказал ""This is the last \u0063hance\x0021""";
 
Console.WriteLine(строка1);
Console.WriteLine(строка2);
// Пример выведет следующий текст:
//     Он сказал "This is the last chance!"
//     Он сказал "This is the last \u0063hance\x0021"

3. Чтобы позволить компилятору различать атрибуты в случае конфликта имен. Атрибут класса, который наследует от Attribute. Имя его типа, как правило, содержит суффикс Attribute, несмотря на то, что компилятор не выполняет это соглашение. Затем на атрибут можно ссылаться в коде либо по его полному имени типа (например, [InfoAttribute]), либо по сокращенному имени (например, [Info]). Однако если два сокращенных имени типов совпадают и одно имя типа содержит суффикс Attribute, а другое — нет, возникает конфликт имен. Например, приведенный ниже код не может быть скомпилирован, так как компилятору не удается определить, какой атрибут — Info или InfoAttribute — применен к классу Example. Подробнее см. [2].

using System;
 
[AttributeUsage(AttributeTargets.Class)]
public class Info : Attribute
{
   private string information;
   public Info(string info)
   {
      information = info;
   }
}
 
[AttributeUsage(AttributeTargets.Method)]
public class InfoAttribute : Attribute
{
   private string information;
   public InfoAttribute(string info)
   {
      information = info;
   }
}
 
// Здесь [Info("Просто исполняемый код.")] приведет к ошибке
// компилятора CS1614. Получается неоднозначность для Info
// и InfoAttribute. Примените '@' спереди, чтобы выбрать 'Info'.
// Укажите полное имя 'InfoAttribute' для его выбора.
[Info("Просто исполняемый код.")]
public class Example
{
   [InfoAttribute("Точка входа в программу.")]
   public static void Main()
   {
   }
}

[Символ интерполируемой строки $]

Специальный знак $ идентифицирует строковый литерал как интерполированную строку, т. е. в результате получается строковый литерал, который может содержать выражения интерполяции. При разрешении интерполированной строки в результирующую элементы с выражениями интерполяции заменяются строковыми представлениями результатов выражений. В C# версии 6 эта функция была добавлена впервые.

Интерполяция строк предоставляет более понятный и удобный синтаксис для создания форматированных строк по сравнению с функцией составного форматирования строк. В следующем примере обе этих функции используются для получения одинаковых выходных данных:

string name = "Андрей";
var date = DateTime.Now;
 
// Вывод с использованием обычного составного форматирования:
Console.WriteLine("Привет, {0}! Сегодня {1}, время {2:HH:mm}.",
                  name, date.DayOfWeek, date);
// Вывод с помощью интерполированной строки:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek},
                     it's {date:HH:mm} now.");
// Оба вызова сгенерируют одинаковый текст:
//    Привет, Андрей! Сегодня среда, время 09:58.

[Ссылки]

1. Специальные символы в C# site:docs.microsoft.com.
2. Ошибка компилятора CS1614 site:docs.microsoft.com.
3. C#: операторы ?? и ??=.

 

Добавить комментарий


Защитный код
Обновить

Top of Page