← Все вопросы

В чём разница между операторами as и is в C#?

Задан 7 месяцев назад1.3к просмотров2 ответа
9

Привожу типы то через (Type)obj, то через as, то проверяю через is. Когда что использовать и в чём разница между as и обычным приведением?

var s = obj as string;
if (obj is string str) { }

2 ответа

16
✓ Принятый ответ — помог автору

Коротко по каждому:

  • is — проверяет, совместим ли объект с типом, возвращает bool. С C# 7 поддерживает паттерн-матчинг с захватом переменной.
  • as — пытается привести; при неудаче возвращает null (не бросает исключение). Работает только со ссылочными и nullable-типами.
  • Явное приведение (Type)obj — бросает InvalidCastException, если тип не подходит.
object obj = "привет";

// as — безопасно, null при неудаче
string s = obj as string;
if (s != null) Console.WriteLine(s.Length);

// is с паттерном — проверка + приведение в одном
if (obj is string str)
    Console.WriteLine(str.Length);

// явное — упадёт, если тип не тот
int n = (int)obj; // InvalidCastException

Правило: если приведение может не сработать и это нормально — используйте as (+ проверка null) или is. Если уверены в типе и хотите явной ошибки при несовпадении — обычный каст. Современный идиоматичный вариант — is с паттерном.

4

Маленькая оговорка про производительность: раньше антипаттерном было писать if (obj is string) { var s = (string)obj; } — тут приведение делается дважды.

is с паттерном if (obj is string s) решает это: проверка и приведение за один проход. Всегда предпочитайте его.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект