2010-12-02 25 views
7

Es macht einfach Sinn manchmal zu überprüfen, ob ein Objekt nicht Art von X ist, so dass Sie diese stattdessen tun müssen, um:Warum gibt es nicht "ist nicht" Stichwort in C#?

if(this.GetType() != typeof(X)) 
{ 
     //Do my thing. 

} 

die ein wenig umständlich ist meiner Meinung nach, würde so etwas nicht schöner sein:

if(this is not X) 
{ 
    //Do my thing 
} 
+0

Diese wären nicht funktional äquivalent, wenn 'X' ein Untertyp von' this.GetType() 'wäre. –

Antwort

20

Wie wäre die logische NOT-Operator !, die Beschreibung des Wortes passt 'nicht' einfach gut:

if (!(this is X)) 
{ 
    //Do my thing 
} 

Wie andere haben jedoch darauf hingewiesen, is wird auch verwendet, um zu überprüfen, ob die Klasse eines Objekts von einer Klasse erbt oder eine Schnittstelle implementiert, die sich ziemlich von GetType() unterscheidet.

Sowohl CodeInChaos als auch StriplingWarrior haben vernünftige Erklärungen dafür, warum es kein not Schlüsselwort in C# gibt.

+1

Wir müssten nicht "nicht" ein Schlüsselwort machen. Es würde wahrscheinlich ausreichen, "ein" Keyword zu erstellen, das "yield return" ähnlich ist. Könnte ein wenig verwirrend sein, da die meisten C# -Programmierer nicht an zwei Wort-Schlüsselwörter gewöhnt sind (oder sollte ich sie als Schlüsselsätze bezeichnen?). Also müsste man "isnot" verwenden, was IMO hässlich aussieht. – CodesInChaos

+1

Ich möchte "!" in einigen Sonderfällen in C erlaubt, wo es eine klare Bedeutung hätte, aber gegenwärtig nicht legal wäre. Ein Fall wäre außerhalb der Klammern für ein Wenn, während usw.(In solchen Kontexten sollte es die Bedingung strikt invertieren, ungeachtet der Überlastung des Operators). Ein anderer Fall könnte hier gut sein: erlaube "this! Is x", um zusätzliche Klammern zu vermeiden. – supercat

4

Verwenden good ol‘Knall Symbol:

if (!(pero is Human)) 
{ 

} 

BTW, ist is anders, weil es nicht nur Blatt abgeleitete Klasse fängt, sondern ganze Hierarchie davon, beide Schnittstellen und Klassen.

Also, für

class Human: ICanSpeak, Mamal 
{ 
... 
} 

Human h; 

if (h is Human) { will be true } 
if (h is ICanSpeak) { will be true } 
if (h is Mamal) { will also be true } 
5

Beachten Sie, dass this.GetType()! = typeof(X) gibt false zurück, wenn diese von abgeleitet (oder Geräte bei einem Schnittstellentyp), aber nicht identisch mit X, während this is X true zurück.

Und warum sollte es ein separates Schlüsselwort geben, wenn Sie einfach !(a is X) verwenden können? Das ist Blähungen der Sprache mit wenig Gewinn. Wie Eric Lippert betont, muss jede neue Sprachfunktion genügend Vorteile bieten, um das Codieren, Dokumentieren, Testen und natürlich die erhöhte Komplexität der Sprache zu kompensieren. Und ein not is Operator bietet einfach nicht genug.

Sie könnten eine Erweiterungsmethode implementieren, aber ich denke, das ist dumm:

public static bool IsNot<T>(this object obj) 
{ 
    return !(obj is T); 
} 
+4

Abgesehen davon, dass Erweiterungsmethoden für Objekte eine fragwürdige Programmierpraxis sind, ist das hier eigentlich keine schlechte kleine Erweiterungsmethode. Ich sage nicht, dass ich es benutzen würde, aber ich denke, es ist ziemlich vernünftig. –

+0

@Eric: Ich wünschte wirklich, C# hätte auch einen Nicht-Operator "nicht" zusätzlich zu! Man könnte sagen, das ist nutzlos aber! ist wirklich schwer zu sehen/spot im code wo als "wenn nicht (vector.IsNormalized)" ist viel einfacher zu parsen als "if! (vector.IsNormalized)", aber ich denke, C# hat es so gemacht, nicht C++ menschen zu verfremden , Recht? –

+2

@Eric, darf ich fragen, warum Objekterweiterungsmethoden als schlechte Praxis angesehen werden? – dexter

9

ein Schlüsselwort einer Sprache Komplexität hinzufügt Hinzufügen. Das Hinzufügen eines Schlüsselworts zu einer Sprache nach der ursprünglichen Spezifikation könnte zu brechenden Änderungen beim Upgrade führen. Daher werden Keywords in der Regel nur hinzugefügt, wenn es einen sehr starken Fall für sie gibt. In diesem Fall, wie die anderen Antworten darauf hin, ist es sehr einfach, den Knall Operator zu verwenden:

if (!(pero is Human)) ... 

... derdiedas ein typischer C# (/ C/C++/Java) Entwickler lesen würde „, wenn nicht (Pero ist menschlich) ". Es gibt also wenig Gründe für ein spezielles Keyword.

+1

Zum Beispiel haben wir in C# kein 'Yield'-Schlüsselwort, weil das eine bahnbrechende Änderung gewesen wäre. 'yield return x' hingegen war illegale Syntax vorher und somit keine brechende Änderung. – CodesInChaos

+1

@CodeInChaos: Ja, aber ein "is not" Schlüsselwort könnte technisch in die gleiche Kategorie wie "yield return" fallen. Der Unterschied besteht darin, dass es sehr viel Arbeit kostet, die "Rendite" zu emulieren, während der Knalloperator und die Klammern genügen, um "nicht" zu emulieren. – StriplingWarrior

+0

Ich glaube, ein "isnot" -Operator (keine Leerzeichen) wäre sehr einfach und sicher zu implementieren. Ich würde definitiv dafür stimmen, dass es Teil der C# -Syntax ist. So oft habe ich es beim Schreiben schnell geschrieben. Es kommt sehr natürlich vor. Es hätte auch Intellisense und es würde alle Klammer- und Negationsoperator-Typisierung speichern. Kurz, es wäre praktisch gewesen. – GDS

Verwandte Themen