Согласно спецификации C # 7.0, вы можете объявить локальную переменную в case
из switch
:
object a = "Hello world";
switch (a)
{
case string _:
// The variable 'a' is a string!
break;
case int _:
// The variable 'a' is an int!
break;
case Foo _:
// The variable 'a' is of type Foo!
break;
}
Вы случайно не спрашиваете, почему переменная объявлена как string _
? Почему подчеркивание?
Ну, еще одна особенность, появившаяся в C # 7.0, заключается в том, что вы можете называть такую переменную, на которую вы никогда не ссылаетесь. Таким образом, вы не можете ссылаться на переменную _
. Это хорошо во многих сценариях, таких как запрос OP, поскольку он хочет просто проверить тип и не получить также приведенную ссылку. В противном случае вы можете переименовать эту переменную и использовать ее в качестве справочной информации.
Это лучший способ сделать это, потому что он включает в себя только операции приведения и операции над стеком, которые являются самыми быстрыми операциями, которые интерпретатор может выполнить сразу после побитовых операций и условий boolean
.
Сравнивая это с Dictionary<K, V>
, мы используем намного меньше памяти: для хранения словаря требуется больше места в ОЗУ, а ЦП требует больше вычислений для создания двух массивов (один для ключей, другой для значений) и сбора хеша коды для ключей, чтобы поместить значения в соответствующие ключи.
Итак, насколько я знаю, я не верю, что может существовать более быстрый способ, даже если вы не хотите использовать только блок if
- then
- else
с is
Оператор следующим образом:
object a = "Hello world";
if (a is string)
{
// The variable 'a' is a string!
} else if (a is int)
{
// The variable 'a' is an int!
} // etc.