Dies ist eine dumme Frage, aber Sie können diesen Code verwenden, um zu überprüfen, ob etwas ein bestimmter Typ ist ...
if (child is IContainer) { //....
Gibt es eine elegantere Möglichkeit, nach der Instanz "NOT" zu suchen?
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) {
Ja, ja ... dumme Frage ....
Da es einige Fragen dazu gibt, wie der Code aussieht, ist es nur eine einfache Rückgabe zu Beginn einer Methode.
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; }
- Ich könnte das if invertieren und den whoooole Rest der Methode in die Klammern des if setzen, aber dann würde ich Weihnachtsbaumcode mit vielen schließenden Klammern am Ende der Methode erhalten. Das ist viel weniger lesbar.ifnot
AussagenAntworten:
ist der einzige Operator (es gibt keinen
IsNot
Operator).Sie können eine Erweiterungsmethode erstellen, die dies tut:
und dann verwenden Sie es, um:
Und Sie könnten Ihrem Thema folgen:
Update (unter Berücksichtigung des Code-Snippets des OP):
Da Sie den Wert anschließend tatsächlich umwandeln, können Sie
as
stattdessen Folgendes verwenden :quelle
IsNot
.Sie können es so machen:
quelle
is
eine höhere Priorität hat als==
. Der einzige Grund, den Sie nicht verwenden können,!x is f
ist, dass es weniger Vorrang hat als!
.if (a is TextReader reader == false)
"sollte" funktionieren, aber Sie können die Variable nicht im wahren Pfad verwenden, da sie möglicherweise nicht initialisiert wurde.out
Parameter)if (a is TextReader reader == true)
, dass die Variable nicht initialisiert ist.Warum nicht einfach das andere benutzen?
Es ist ordentlich, vertraut und einfach?
quelle
Die Art und Weise, wie Sie es haben, ist in Ordnung, aber Sie könnten eine Reihe von Erweiterungsmethoden erstellen, um "eine elegantere Möglichkeit zu finden, nach der 'NOT'-Instanz zu suchen".
Dann könnten Sie schreiben:
quelle
Dies wurde noch nicht erwähnt. Es funktioniert und ich denke, es sieht besser aus als mit
!(child is IContainer)
is
Syntax:expr is constant
wobei expr der auszuwertende Ausdruck und const der zu testende Wert ist.quelle
if (part as IContainer is null)
. Ehrlich gesagt nicht sicher, was besser ist.Hässlich? Ich stimme dir nicht zu. Der einzige andere Weg (ich persönlich finde das "hässlicher"):
quelle
as
Klausel.obj as int
ist immer ein Fehler bei der Kompilierung.is
Form ist.Der
is
Operator ergibt ein boolesches Ergebnis, sodass Sie alles tun können, was Sie sonst auf einem Bool tun könnten. Um es zu negieren, verwenden Sie den!
Operator. Warum sollten Sie nur dafür einen anderen Operator haben wollen?quelle
Die Erweiterungsmethode
IsNot<T>
ist eine gute Möglichkeit, die Syntax zu erweitern. Merken Sie sichfunktioniert besser als so etwas zu tun
In Ihrem Fall spielt es keine Rolle, wie Sie von der Methode zurückkehren. Mit anderen Worten, achten Sie darauf, dass Sie nicht sowohl die Typprüfung als auch die Typkonvertierung unmittelbar danach durchführen.
quelle
Dies vermeidet zwar nicht das Problem der Klammern, sollte jedoch erwähnt werden, dass eine neuere Syntax (ab C # 7) vorhanden ist, um den Rest Ihres Codes ein wenig übersichtlicher zu gestalten:
Dies vermeidet die doppelte Umwandlung, die Nullprüfung und das Vorhandensein einer Variablen in Bereichen, in denen sie null sein könnte.
quelle
Während der IS-Operator normalerweise der beste Weg ist, gibt es eine Alternative, die Sie unter bestimmten Umständen verwenden können. Sie können den Operator as verwenden und auf null testen.
quelle
C # 9 (freigegeben wird mit .NET 5) wird die logischen Muster umfassen
and
,or
undnot
, was uns dieses eleganten schreiben kann:Ebenso kann dieses Muster verwendet werden, um nach Null zu suchen:
Weitere Informationen zum Github-Problem finden Sie unter Nachverfolgung dieser Änderung.
quelle
quelle