Überprüfen Sie, ob das Objekt NICHT vom Typ ist (! = Entspricht "IS") - C #

72

Das funktioniert gut:

    protected void txtTest_Load(object sender, EventArgs e)
    {
        if (sender is TextBox) {...}

    }

Gibt es eine Möglichkeit zu überprüfen, ob der Absender KEINE TextBox ist, eine Art Äquivalent von! = Für "ist"?

Bitte schlagen Sie nicht vor, die Logik auf ELSE {} zu verschieben :)

römisch m
quelle

Antworten:

176

Dies ist eine Möglichkeit:

if (!(sender is TextBox)) {...}
Jon Tackabury
quelle
6
Für diese spezielle Situation bevorzuge ich if (Absender ist TextBox == false). Weniger klobige Syntax wie diese.
Igal Tabachnik
8
@hmemcpy: Ich persönlich erschrecke, wenn ich einen Vergleich mit einer booleschen Konstante sehe. Wahrscheinlich zeigt sich mein C-Hintergrund ... Trotzdem krabbelt meine Haut, und ich würde sie auf keinen Fall in dem Code, den ich gerade bearbeitete, in Ruhe lassen.
Shog9
@IgalTabachnik imo Wenn Sie logisch invertierte Aussagen mit Ausführlichkeit aus Gründen der Klarheit schreiben if (false == sender is TextBox)
möchten
1
@ Shog9 Ich habe vor ein paar Jahren angefangen zu programmieren (und definitiv nicht mit C) und ich habe nie verstanden, warum Leute == false oder false == verwenden: es ist für mich überhaupt nicht intuitiver und ich bevorzuge es immer! darüber. Es ist nur - überflüssig.
Mafii
Nachdem ich den obigen Kommentar gelesen habe, denke ich, dass es klarer ist, ihn zu verwenden, falseals ihn zu negieren. Die Verwendung des Wortes iskann genug visuelle Ablenkung sein, so dass ein bloßer Blick durch den Code das leicht übersehen kann!
theMayer
8

Könnten Sie nicht auch den ausführlicheren "alten" Weg vor dem isSchlüsselwort machen:

if (sender.GetType() != typeof(TextBox)) { // ... }
Wayne Molina
quelle
11
Sicher, Sie könnten, aber beachten Sie, dass das Schlüsselwort "is" mit jedem von TextBox abgeleiteten Objekt übereinstimmt, während diese Prüfung von typeof () nur mit TextBoxen übereinstimmt.
mqp
2

Zwei bekannte Methoden sind:

1) Verwenden des IS-Operators:

if (!(sender is TextBox)) {...}

2) Verwenden des AS-Operators (nützlich, wenn Sie auch mit der textBox-Instanz arbeiten müssen):

var textBox = sender as TextBox;  
if (sender == null) {...}
John-Philip
quelle
Für zukünftige Leser: Der Unterschied zwischen isund askann hier gefunden werden
kkuilla
-2

Wenn Sie Vererbung verwenden wie:

public class BaseClass
{}
public class Foo : BaseClass
{}
public class Bar : BaseClass
{}

... Null resistent

if (obj?.GetType().BaseType != typeof(Bar)) { // ... }

oder

if (!(sender is Foo)) { //... }
szydzik
quelle
-4

Versuche dies.

var cont= textboxobject as Control;
if(cont.GetType().Name=="TextBox")
{
   MessageBox.show("textboxobject is a textbox");
} 
Joee
quelle
1
Warum as Controlverhält sich die erste Zeile anders als GetType()auf einer object? Abgesehen davon ist der Zeichenfolgenvergleich für so etwas kein refaktorfreundlicher Code.
user247702