Operator is
Słowo kluczowe is
reprezentuje operator porównania typów. Gdy zostanie użyte, zwraca wartość logiczną (true
bądź false
). Użycie operatora is
jest podobne do wykorzystania podstawowego operatora równości ==
. Przyjrzyj się poniższemu przykładowi. Oba porównania służą do sprawdzenia, czy dany obiekt jest określonego typu.
Z logicznego punktu patrzenia, obie metody zwrócą ten sam rezultat. W tym konkretnym przypadku będzie to true
. Sam z pewnością przyznasz, że czytelność drugiej wersji z operatorem is
jest znacznie bardziej czytelna i wygląda zdecydowanie przyjaźniej.
W przypadku operacji na typach złożonych należy zachować szczególną ostrożność. Przyjrzyj się poniższym uproszczonym klasom i spróbuj przewidzieć wyniki operacji.
Operator równości (==
) działa ściśle, stąd otrzymamy wynik false
. Natomiast operator is
oceni możliwość niejawnych konwersji referencji podczas porównania, przez co otrzymamy wynik true
.
Metoda OfType
Analogicznie co do zasady działania operatora is
działa rozszerzająca interfejs IEnumerable
metoda OfType<T>()
. Do pełnego zrozumienia jej działania przyjrzyj się poniższemu przykładowi:
W rezultacie lista animals
będzie zawierała wszystkie elementy sourceList
, ponieważ ich typ lub typ po którym dziedziczą, to Animal
. Aby odfiltrować listę by otrzymać tylko elementy typu Animal
musisz skorzystać z operatora równości i ścisłego porównania typów. Można do tego celu zastosować metodę rozszerzającą, zdefiniowaną poniżej.

Operator as
W przeciwieństwie do is
– operator porównania typów – słowo kluczowe as
jest operatorem konwersji typu. Wykorzystywany do konwertowania typów referencyjnych, lub typów dopuszczających wartość null
. W celu lepszego zrozumienia, przyjrzyj się poniższemu przykładowi:
Zmienna animal
co prawda nie zdegraduje się do klasy bazowej, ale fakt że nie ma wartości null
potwierdza możliwość konwersji na ten typ. W przypadku odwrotnym, gdybyś chciał konwertować zmienną typu Animal
na Cow
otrzymałbyś wartość null
.
Przydatność operatora as
może okazać się znacznie wyraźniejsza, gdy mamy do czynienia z boxing’iem i operujemy na obiektach o nieznanym konkretnym typie object
. Przyjrzyjmy się temu bliżej w kolejnym akapicie.
Rzutowanie
Powiesz, „ale zaraz, a co z rzutowaniem”. Otóż jest zasadnicza różnica, operator as
nie rzuci nam wyjątkiem. W przypadku operacji na znanych typach, kompilator od razu wyświetli błąd Cannot cast expresion of type...
. Przy bardziej generycznym podejściu, gdy typ obiektu nie jest jawnie znany, otrzymasz ostrzeżenie Possible 'System.InvalidCastException'
. W przypadku wykonania kodu i faktycznie typ nie będzie się zgadzał, otrzymasz wyjątek Unable to cast object of type...
.
Operator as
pozwala uchronić się przed wyjątkiem, i w przypadku braku możliwości konwersji na dany typ, obiekt przyjmie wartość null
.
Podsumowanie operatorów is
oraz as
Przypadki zastosowania słów kluczowych is
(operator porównania typów) oraz as
(operator konwersji typu) z pewnością się różnią. Nieocenioną poprawę czytelności, czy obiekt przyjmuje wartość null zapewnia operator is
. Więcej o samych nullach i jak można sobie z nimi radzić, znajdziesz w tym artykule.
Dla przypomnienia, dany operator stosujemy kiedy:
is
- chcesz sprawdzić czy obiekt jest danego typu
- i potrzebujesz tą wiadomość jako wartość logiczną
- i (opcjonalnie, jeśli występuje dziedziczenie) interesuje Cię, czy dziedziczy po konkretnej klasie / klasie bazowej
as
- potwierdzić możliwość konwersji typu
- rzutować na dany typ bezpiecznie następnie obsługując przypadek
null
Jeśli zainteresował Cię materiał, zapraszam do listy mailowej, by odebrać wartościowe bonusy i być na bieżąco z kolejnymi wpisami.