Понимание символа «@» в C#

Символ @ может быть довольно запутанным для некоторых разработчиков C. Я даже знал некоторых, кто программировал довольно долгое время, но у которых все еще есть неправильные предположения о том, что делает @.

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

Если вы хотите поместить обратную косую черту в строку, вам нужно «убежать от нее», поставив перед ней другую обратную косую черту, чтобы вы получили \\\\. Например, следующий код помещает строку «C: \\ temp \\ whatever» в строковую переменную my_path.

string my_path = "C:\\temp\\whatever"

Если вам нужно ввести много строк, содержащих обратную косую черту, это становится довольно раздражающим. Чтобы сделать вещи немного проще, C позволяет добавить символ @ перед строкой, чтобы создать «дословный строковый литерал», где обратная косая черта не интерпретируется как escape-символы. Когда вы это сделаете, вы не можете вставлять специальные символы, такие как символы новой строки и вкладки внутри строки. Следующий код эквивалентен предыдущему коду, за исключением того, что он использует строковый литерал.

string my_path = @"C:\temp\whatever"

Помните, что все это относится только к вашему коду, а не к чему-либо, что пользователь вводит, например, в TextBox или ComboBox. Все, что пользователь вводит, становится частью свойства Text элемента управления без экранирования и не имеет специального значения, привязанного к символу \\. Вам не нужно беспокоиться о том, чтобы обращаться с символами эвакуации по-разному во что угодно, потому что пользователь не может вводить специальные символы таким образом. Другими словами, пользователь не может ввести символ табуляции, набрав \\ t.

Чтобы сделать ситуацию более запутанной, C также позволяет вам объявить переменную с именем, которое начинается с @, чтобы создать «verbatim identifier». Это позволяет создавать переменные с именем после таких ключевых слов, как for и struct. Конечно, переменные на самом деле называются @for и @struct, поэтому вы не можете назвать их после ключевых слов.

В любом случае это кажется действительно плохой идеей. Это сделает ваш код более трудным для чтения и понимания. Кроме того, если вам действительно нужно назвать переменный выход, вы можете использовать знак подчеркивания перед ним, чтобы получить _exit. Все еще запутанный, но по крайней мере он не перетаскивает символ @ в вещи, чтобы сделать их еще более запутанными.

Причина, по которой я так беспокоюсь по этой проблеме, - это то, что я недавно видел код, похожий на следующий:

string user_first_name = @txtFirstName.Text

Я на самом деле не совсем уверен, что C думает, что это делает с этим символом @, но он позволяет программе продолжать работу. То, что программист считал этим, было защитой программы от escape-символов, например, если пользователь ввел \\ t. На самом деле это ничего не значит. (Я думаю, что это совершенно странно, что C даже позволяет это.)

Следующий код показывает, как программа демонстрирует различные строковые литералы и другие проблемы с строкой при ее запуске.

private void Form1_Load(object sender, EventArgs e)
{
    txtDoubleSlash.Text = "C:\\temp\\whatever";
    txtAtSign.Text = @"C:\temp\whatever";
    txtFirstLabel.Text = label1.Text;
    txtSecondLabel.Text = label2.Text;

    // Некоторые слабо названные переменные, которые используют @.
    string[] @foreach = { "A", "B", "C" };
    foreach (string _foreach in @foreach)
    {
        Console.WriteLine(_foreach);
    }

    // Добавление @ не изменяет содержимое TextBox.
    Console.WriteLine(txtDoubleSlash.Text);
    Console.WriteLine(@txtDoubleSlash.Text);
}

Сначала код отображает две строки, содержащие встроенные обратные косые черты в текстовых полях. Первое утверждение ускользает от обратных косых черт. Второй использует стенографический литерал.

Затем код копирует текст из двух элементов управления Label в два элемента управления TextBox в верхнем левом углу формы. Обратите внимание, что результат на снимке показывает значения, как они отображаются в элементах управления Label, без безумства. Значения в свойствах «Ярлыки» «Текст» так же, как и должны быть, и экранирование не применяется.

Затем код демонстрирует действительно запутанный цикл, который использует символы @ и _, чтобы переменные выглядели как ключевые слова. Плохая идея!

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

Если вы вводите текст в текстовом поле над кнопкой, а затем нажмите кнопку, выполняется следующий код.

private void btnShowValue_Click(object sender, EventArgs e)
{
    txtResult.Text = txtEnteredValue.Text;
}

Этот код отображает значение, введенное в TextBox. Снова заметим, что ему ничего не нужно делать о escape-последовательностях.

Таким образом, вам нужно только беспокоиться о escape-последовательностях или символе @ в строковых литералах внутри вашего кода. Вам не нужно беспокоиться о них в тексте, набранном пользователем. Эта программа не демонстрирует этого, но вам также не нужно беспокоиться о них в тексте, который вы читаете из файла или другого источника данных.

И не делайте стенографические идентификаторы. Они просто путают!

(Извините, что побил этот вопрос до смерти, но я вижу много путаницы и мифологии, связанных с этой проблемой.)

 
Источник: http://csharphelper.com/blog/2017/06/understand-the-at-symbol-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector