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 typuobject o = "tekst";
// is sprawdza typ i zwraca bool; tu od razu z przypisaniem do zmiennej sif (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 InvalidCastExceptionstring 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 zakresuint 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)oprzy 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.