С# Имя переменной "_" (только подчеркивание)
Я был просто поражен незначительной проблемой на С#, это была просто ошибка копирования-вставки, но не знаю, как С# принять ее.
Этот код успешно скомпилируется... КАК
namespace DemoNS
{
class DemoClass
{
String _ = new String('a', 1);
}
}
Есть ли значение по умолчанию для переменной с именем _
?
Ответы
Ответ 1
Нет, значение по умолчанию отсутствует, _
- это просто имя переменной, как и любое другое.
Мне нравится использовать его аналогично анонимным переменным Prolog: когда вы создаете лямбду, игнорирующую один из ее параметров, вы можете назвать ее _
:
EventHandler handler = (_, e) => Console.WriteLine(e);
С другой стороны, я бы не использовал его нигде, вместо этого вы должны использовать описательное имя.
EDIT: Обратите внимание, что в С# 7.0 _
иногда имеет особое значение. Например, вы можете написать _ = new String('a', 1);
, даже если вы не объявили переменную с именем _
.
Ответ 2
В настоящее время с С# 7.0 значение _
имеет значение иногда. Он стал оператором сброса для новой функции out var
. Он используется, когда функция возвращает значение, и вы хотите уведомить компилятор, что вы его не используете, поэтому его можно оптимизировать. Или при деконструировании (еще одна функция С# 7.0) вы можете использовать ее, чтобы игнорировать часть кортежа, которой вас не интересует.
Пример
out var
void Test(out int i) => i = 1;
Test(out _); // _ was never declared, it will still compile in C# 7.0
var r = _; // error CS0103: The name '_' does not exist in the current context
Пример
деконструкция кортежа
var Person = ("John", "Smith");
var (First, _) = Person; // '_' is not a declared
Debug.Print(First); // prints "John"
Debug.Print(_); // error CS0103: The name '_' does not exist in the current context
Возникает проблема, если вы объявляете свою собственную переменную с именем _
, а затем используете оператор discard, это вызовет неоднозначность. Эта проблема была сообщена Здесь.
ИЗМЕНИТЬ
Выше проблема не проблема, как @maf-soft указывает в комментариях. Если объявлен _
, он обрабатывается как регулярная переменная, как это было до С# 7.0.
Ответ 3
_
является допустимым символом, аналогичным a
или i
, а синтаксические переменные могут начинаться с _
, поэтому односимвольное имя _
отлично синтаксически корректно. Не очень хороший выбор, но он будет компилироваться и работать нормально.