Looking for c# Keywords? Try Ask4Keywords

C# Language декларация var


пример

Обычным шаблоном в C # является использование bool TryParse(object input, out object value) для безопасного анализа объектов.

Объявление out var является простой функцией улучшения удобочитаемости. Он позволяет объявлять переменную в то же самое время, которое передается как параметр out.

Переменная, объявленная таким образом, привязана к остальной части тела в точке, в которой она объявлена.

пример

Используя TryParse до C # 7.0, вы должны объявить переменную для получения значения перед вызовом функции:

7,0
int value;
if (int.TryParse(input, out value)) 
{
    Foo(value); // ok
}
else
{
    Foo(value); // value is zero
}

Foo(value); // ok

В C # 7.0 вы можете вставить объявление переменной, переданной в параметр out , исключая необходимость в отдельном объявлении переменной:

7,0
if (int.TryParse(input, out var value)) 
{
    Foo(value); // ok
}
else
{
    Foo(value); // value is zero
}

Foo(value); // still ok, the value in scope within the remainder of the body

Если некоторые из параметров, возвращаемых функцией out не нужны, вы можете использовать оператор discard _ .

p.GetCoordinates(out var x, out _); // I only care about x

out var объявление может быть использовано с любой существующей функцией , которая уже имеет out параметров. Синтаксис объявления функции остается тем же, и никаких дополнительных требований не требуется для обеспечения совместимости функции с объявлением out var . Эта особенность - просто синтаксический сахар.

Другая особенность объявления out var заключается в том, что ее можно использовать с анонимными типами.

7,0
var a = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var groupedByMod2 = a.Select(x => new
                                  {
                                      Source = x,
                                      Mod2 = x % 2
                                  })
                     .GroupBy(x => x.Mod2)
                     .ToDictionary(g => g.Key, g => g.ToArray());
if (groupedByMod2.TryGetValue(1, out var oddElements))
{
    Console.WriteLine(oddElements.Length);
}

В этом коде мы создаем Dictionary с ключом int и массив анонимного значения типа. В предыдущей версии C # было невозможно использовать метод TryGetValue потому что вам нужно было объявить переменную out (которая имеет анонимный тип!). Однако, out var нам не нужно явно указывать тип переменной out .

Ограничения

Обратите внимание, что объявления var var ограничены в запросах LINQ, поскольку выражения интерпретируются как выражения лямбда-тел, поэтому объем вводимых переменных ограничен этими лямбдами. Например, следующий код не будет работать:

var nums = 
    from item in seq
    let success = int.TryParse(item, out var tmp)
    select success ? tmp : 0; // Error: The name 'tmp' does not exist in the current context

Рекомендации