As & Is w C# – operatory testowania typów

AS n IS w C#

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.

Odbierz darmowy eBook

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.

Link do oryginału stanowiącego bazę wpisu [EN]

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments