To głupie pytanie, ale możesz użyć tego kodu, aby sprawdzić, czy coś jest określonego typu ...
if (child is IContainer) { //....
Czy istnieje bardziej elegancki sposób sprawdzenia wystąpienia „NIE”?
if (!(child is IContainer)) { //A little ugly... silly, yes I know...
//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) {
if (child aint IContainer) {
if (child isnotafreaking IContainer) {
Tak, tak ... głupie pytanie ...
Ponieważ jest pewne pytanie , jak wygląda kod, jest to zwykły powrót na początku metody.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
if (!(argument is MapsControlViewModel vm)) { return; }
- Mogę odwrócić if i umieścić resztę metody whoooole w nawiasach if, ale wtedy dostanę kod choinki, z dużą ilością nawiasów zamykających na końcu metody. To o wiele mniej czytelne.ifnot
oświadczeńOdpowiedzi:
jest jedynym operatorem, który może przejść (nie ma
IsNot
operatora).Możesz zbudować metodę rozszerzenia, która to robi:
a następnie użyj go do:
I możesz śledzić swój temat:
Aktualizacja (z uwzględnieniem fragmentu kodu PO):
Ponieważ faktycznie rzutujesz wartość później, możesz po prostu użyć
as
zamiast tego:źródło
IsNot
.Możesz to zrobić w ten sposób:
źródło
is
ma wyższy priorytet w stosunku do==
. Jedynym powodem, dla którego nie możesz użyć,!x is f
jest to, że ma on mniejszy priorytet niż!
.if (a is TextReader reader == false)
„powinno” działać, ale nie pozwoli ci użyć zmiennej w prawdziwej ścieżce, mówiąc, że mogła nie zostać zainicjowana.out
parametrów)if (a is TextReader reader == true)
że uważa, że zmienna jest niezainicjowana.Dlaczego nie skorzystać z innego?
Czy to dobrze znane i proste?
źródło
Sposób, w jaki masz to jest w porządku, ale mógłby stworzyć zestaw metod rozszerzających, aby „bardziej elegancki sposób, aby sprawdzić, czy«nie», np.”
Następnie możesz napisać:
źródło
Nie zostało to jeszcze wspomniane. Działa i myślę, że wygląda lepiej niż używanie
!(child is IContainer)
is
składniaexpr is constant
:, gdzie wyrażenie jest wyrażeniem do oceny, a stała jest wartością do sprawdzenia.źródło
if (part as IContainer is null)
. Szczerze mówiąc, nie jestem pewien, co jest lepsze.Brzydki? Nie zgadzam się. Jedyny inny sposób (osobiście uważam, że jest to „brzydsze”):
źródło
as
klauzula.obj as int
jest zawsze błędem czasu kompilacji.is
formy.Do
is
ocenia operatorowi logiczną wyniku, więc można zrobić coś byś inaczej być w stanie zrobić na bool. Aby to zanegować, użyj!
operatora. Dlaczego miałbyś chcieć mieć do tego innego operatora?źródło
Metoda rozszerzenia
IsNot<T>
jest dobrym sposobem na rozszerzenie składni. Pamiętaćdziała lepiej niż coś takiego
W twoim przypadku nie ma to znaczenia, gdy wracasz z metody. Innymi słowy, należy uważać, aby nie sprawdzić zarówno typu, jak i konwersji bezpośrednio po nim.
źródło
Chociaż nie pozwala to uniknąć problemu w nawiasach, dla dobra ludzi przybywających tutaj przez Google, należy wspomnieć, że istnieje nowsza składnia (od C # 7), aby resztę kodu uczynić nieco czystszą:
Dzięki temu unika się podwójnego rzutowania, sprawdzania wartości zerowej i posiadania zmiennej dostępnej w zakresach, w których może ona być zerowa.
źródło
Chociaż operator IS jest zwykle najlepszym sposobem, istnieje alternatywa, z której można skorzystać w niektórych okolicznościach. Możesz użyć operatora as i przetestować na wartość NULL.
źródło
C # 9 (aby zostać zwolnione z .NET 5) obejmie logiczne wzory
and
,or
inot
, co pozwala nam napisać to bardziej elegancko:Podobnie, tego wzoru można użyć do sprawdzenia wartości null:
Możesz znaleźć więcej szczegółów na temat problemu Github śledzącego tę zmianę.
źródło
źródło