Подтвердить что ты не робот

С# Имя переменной "_" (только подчеркивание)

Я был просто поражен незначительной проблемой на С#, это была просто ошибка копирования-вставки, но не знаю, как С# принять ее.

Этот код успешно скомпилируется... КАК

namespace DemoNS
{
    class DemoClass
    {
        String _ = new String('a', 1);        
    }
}

Есть ли значение по умолчанию для переменной с именем _?

4b9b3361

Ответ 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, а синтаксические переменные могут начинаться с _, поэтому односимвольное имя _ отлично синтаксически корректно. Не очень хороший выбор, но он будет компилироваться и работать нормально.