Использование шаблона Var в С# 7

Я видел этот пример шаблона var в новом С# 7

if (o is var x) Console.WriteLine($"it a var pattern with the type {x?.GetType()?.Name}");

В чем отличие использования:

var x = o;
Console.WriteLine($"it a var pattern with the type {x?.GetType()?.Name}");

И когда этот шаблон является полезным решением.

Ответ 1

Там нет практической разницы в этом примере. К сожалению, так много сайтов используют это - даже справочник по языку.

Основной причиной, по которой вы бы использовали шаблон x is var y переменная x is var y, если вам нужна временная переменная внутри логического выражения. Например:

allLists.Where(list => list.Count() is var count && count >= min && count <= max)

Создавая временную переменную count мы можем использовать ее несколько раз без снижения производительности при вызове Count() каждый раз.

В этом примере мы могли бы использовать вместо этого is int count - var - это просто стилистический выбор. Однако есть два случая, когда требуется var: для анонимных типов или если вы хотите разрешить нулевые значения. Последнее потому, что null не соответствует ни одному типу.

В частности, для if, однако, вы можете сделать то же самое: if (list.Count() is var count && count >= min && count <= max). Но это явно глупо. Общий консенсус, похоже, заключается в том, что нет смысла использовать его в if. Но язык не помешает вам, потому что запрет этой конкретной формы выражения в этом конкретном выражении выражения усложнит язык.

Ответ 2

Поскольку вопрос, заданный здесь InBetween, объясняет одно использование шаблона var, это когда операторы switch используются следующим образом:

string s = null;
var collection = new string[] { "abb", "abd", "abc", null};
switch (s)
{
    case "xyz":
        Console.WriteLine("Is xyz");
        break;

    case var ss when (collection).Contains(s):
        Console.WriteLine("Is in list");
        break;

    default:
        Console.WriteLine("Failed!");
        break;

}

А.С. Айдын сказал Адн в своем ответе.

Ответ 3

Синтаксис

if (o is SomeType x)

Является сокращением для

SomeType x;
if (o is SomeType)
{
    x = (SomeType)o;

Это позволяет вам сохранить пару строк, которые на самом деле не дают значимой разницы в коде (т.е. объявление и литье).

Также обратите внимание на то, что вам здесь сложно использовать var, потому что вам нужно предоставить тип для сравнения и отбрасывания. Использование var просто вернет вам тот же тип, который был объявлен x, потому что весь компилятор сможет сделать вывод.