Skip to content

Zadanie 21

Rola operatorów is oraz as w języku C#

Operator is sprawdza, czy obiekt jest danego typu (lub typu pochodnego), i zwraca wartość logiczną true/false.

Operator as próbuje rzutować obiekt na wskazany typ referencyjny lub typ dopuszczający null. Jeśli rzutowanie się nie powiedzie, zwraca null zamiast rzucać wyjątek (w przeciwieństwie do zwykłego rzutowania w nawiasach, które zgłasza InvalidCastException). Dlatego as jest bezpieczniejszy, gdy nie mamy pewności co do typu.

// object przechowa cokolwiek; tu trzyma napis, ale nie wiemy tego z typu
object o = "tekst";
// is sprawdza typ i zwraca bool; tu od razu z przypisaniem do zmiennej s
if (o is string s)
{
Console.WriteLine(s.Length);
}
// as próbuje rzutować; przy niepowodzeniu zwraca null (bez wyjątku)
string t = o as string;
if (t != null)
{
Console.WriteLine(t);
}

Zwykłe rzutowanie (Typ)o przy złym typie rzuca wyjątek, a as zwraca null. Dla typów wartościowych as wymaga wersji nullowalnej (int?).

// zwykłe rzutowanie - przy złym typie InvalidCastException
string a = (string)o;
// as z typem wartościowym wymaga int? (inaczej błąd kompilacji)
object obj = 5;
int? n = obj as int?;

Operator is można łączyć z dopasowaniem wzorca (pattern matching), co pozwala w jednym warunku sprawdzić typ, wartość lub zakres:

// wzorzec relacyjny i logiczny: sprawdzenie zakresu
int age = 25;
bool isAdult = age is >= 18 and < 65;

Skrót do zapamiętania: is sprawdza typ i zwraca bool (z możliwym dopasowaniem wzorca). as próbuje rzutować i przy niepowodzeniu zwraca null zamiast wyjątku.

  • is: test typu -> bool; od C# 7 z pattern matching (o is string s).
  • as: bezpieczne rzutowanie typów referencyjnych/nullable; niepowodzenie -> null.
  • Zwykłe rzutowanie (Typ)o przy błędzie rzuca InvalidCastException.
  • as nie działa na zwykłych typach wartościowych (trzeba int?, double? itd.).
  • as używamy, gdy nie mamy pewności co do typu i chcemy dalej użyć wartości.
  • Wzorce z is: type pattern, is null/is not null, wzorce relacyjne/logiczne (and, or, not).
  • is + wzorzec często zastępuje as + sprawdzenie nulla.