Использование шаблона 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, потому что весь компилятор сможет сделать вывод.