Имя переменной C # только "_" (подчеркивание) - PullRequest
18 голосов
/ 10 июня 2011

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

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

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

Существует ли значение по умолчанию переменной с именем _?

Ответы [ 3 ]

38 голосов
/ 10 июня 2011

Нет, значение по умолчанию отсутствует, _ - это просто имя переменной, как и любое другое.

Мне нравится использовать его аналогично анонимным переменным Prolog: когда вы создаете лямбду, которая игнорирует один из ее параметров, вы можете назвать ее _:

EventHandler handler = (_, e) => Console.WriteLine(e);

С другой стороны, я бы нигде не использовал его, вместо этого вам следует использовать описательное имя.

РЕДАКТИРОВАТЬ: Обратите внимание, что в C # 7.0, _ иногда имеет особое значение. Например, вы можете написать _ = new String('a', 1);, даже если вы не объявили переменную с именем _.

31 голосов
/ 05 мая 2017

В настоящее время с C # 7.0 значение _ иногда имеет значение.Он стал оператором сброса для новой функции out var.Он используется, когда функция возвращает значение, и вы хотите уведомить компилятор о том, что вы не будете его использовать, поэтому его можно оптимизировать.Или при деконструкции (другая функция C # 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 отмечает в комментариях.Если было объявлено _, оно обрабатывается как обычная переменная, как это было до C # 7.0.

6 голосов
/ 10 июня 2011

_ является допустимым символом, таким же, как a или i, и синтаксические переменные могут начинаться с _, поэтому однозначное имя _ является совершенно синтаксически правильным.Не очень хороший выбор, но скомпилируется и будет работать нормально.

...