← Все вопросы
В чём разница между операторами as и is в C#?
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) решает это: проверка и приведение за один проход. Всегда предпочитайте его.
Ваш ответ
Войдите, чтобы ответить на вопрос.