Понимание символа «@» в 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-последовательностях или символе @ в строковых литералах внутри вашего кода. Вам не нужно беспокоиться о них в тексте, набранном пользователем. Эта программа не демонстрирует этого, но вам также не нужно беспокоиться о них в тексте, который вы читаете из файла или другого источника данных.
И не делайте стенографические идентификаторы. Они просто путают!
(Извините, что побил этот вопрос до смерти, но я вижу много путаницы и мифологии, связанных с этой проблемой.)