Warum können wir nicht 'if (object)' in C # verwenden, um zu testen, ob das Objekt null ist?

8

Um in C zu testen, ob ein Zeiger Null ist, können wir tun:

  • if (p != NULL)
  • if (p != 0)
  • if (p)

Warum gibt es in C # keine Entsprechung, die es uns erlauben würde, Folgendes zu tun?

%Vor%

statt

%Vor%     
Otiel 17.11.2011, 15:29
quelle

8 Antworten

20

Da Tests dieser Art zu unerwarteten Fehlern in Programmen führen können, haben sie es vorgezogen, explizite Boolesche Ausdrücke zu verwenden (wie Java), anstatt eine implizite Konvertierung in bool .

Dies ist auch der Grund, warum Sie ein int nicht als booleschen Ausdruck in C # verwenden können. Da die einzigen gültigen booleschen Ausdrücke Ausdrücke sind, die direkt in bool ausgewertet werden, werden unerwartete Fehler im Code verhindert, z. B. der alte C-Fehler:

%Vor%

Kurz gesagt, wurde es nicht einbezogen, um Lesbarkeit und Explizitheit zu begünstigen. Ja, es kommt zu einem leichten Preis in der Kürze, aber die Gewinne in der Verringerung von unerwarteten Fehlern mehr als die Kosten von hainvg, um != null innerhalb der hinzuzufügen Klammer ...

(Sie können natürlich eine implizite Konvertierung eines benutzerdefinierten Typs in bool als Workaround erstellen, aber Sie können dies global nicht auf einen beliebigen Objekttyp anwenden)

    
James Michael Hare 17.11.2011, 15:30
quelle
14
  

Warum gibt es in C # keine Entsprechung, die es uns erlauben würde, Folgendes zu tun?

Um verwendet zu werden, muss eine Funktion zuerst lauten:

  • dachte an
  • entworfen
  • angegeben
  • genehmigt
  • implementiert
  • getestet
  • ausgeliefert

An die Funktion, die Sie erwähnen, wurde gedacht. Es wurde nicht vom Design-Komitee entworfen, spezifiziert oder genehmigt, es wurde nicht vom Entwicklungsteam implementiert, es wurde nicht getestet und es wurde noch nie in einem Produkt geliefert. Daher können Sie die Funktion nicht verwenden.

Wenn das Ihre Frage nicht beantwortet, dann eine bessere Frage stellen . Zu fragen, warum eine Sprache keine Funktion hat, ist wie die Frage, warum eine Box leer ist. Jede leere Box ist aus dem gleichen Grund leer: weil nichts darin ist . Jede nicht verfügbare Funktion ist nicht verfügbar, da sie nie an Kunden ausgeliefert wurde, und es gibt nicht viel mehr darüber zu sagen.

    
Eric Lippert 17.11.2011 16:19
quelle
9

Technisch gesehen funktioniert es nicht, weil es keine implizite Konvertierung gibt, die von Ihrer Benutzerdefiniert ist Objektklasse zu bool (boolean). Solange Sie einen impliziten Konvertierungsoperator angeben, der Ihr Objekt auf Null prüft, können Sie mit Ihrer Syntax fortfahren:

%Vor%

Integration des Vorschlags durch Dan Bryant :

Alternativ können Sie implizite "true" - und "false" -Operatoren für Ihren Datentyp implementieren. Dies ist möglicherweise erforderlich, wenn Ihr Typ die Tristate-Auswertung für bool zulässt: true, false und null. Dies ist ein häufiger Fall in Datenbanken, in denen der Nullwert fehlende Daten angibt. Hier ist ein Beispiel aus der MSDN-Webseite :

%Vor%     
Alexander Galkin 17.11.2011 15:33
quelle
4

Denn so haben die Sprachdesigner die Sprache gestaltet. Teilweise ist es, dumme Fehler wie:

zu verhindern %Vor%     
McKay 17.11.2011 15:31
quelle
3

Da ein Objekt kein Zeiger ist, ist es ein Objekt.

    
Scott Chamberlain 17.11.2011 15:31
quelle
2

Weil es nicht in der C # Spezifikation ist und der Compiler einen solchen Ausdruck nicht versteht.

Und wenn Sie nach dem Grund suchen, warum es in C # nicht auf diese Weise verwendet wird - ist es aus meiner Sicht völlig unlogisch, etwas auf eine Art und Weise zu überprüfen, wenn (Objekt).

Wenn Objekt was?

    
Maxim V. Pavlov 17.11.2011 15:32
quelle
1

Ihr Beispiel sieht nur lesbar aus, weil Ihr Objekt "Objekt" genannt wird. In Wirklichkeit haben Objekte Namen, die von ihrer Verwendung / Funktion herrühren. Wenn Ihr Objekt "validedWidget" heißt, würde Ihr Code wie folgt aussehen:

%Vor%

Was würde fälschlicherweise etwas bedeuten wo:

%Vor%

Ist viel expliziter und macht kaum Arbeit.

    
iandotkelly 17.11.2011 15:36
quelle
0

Syntax von if-Anweisung ist ::

%Vor%

und das Ergebnis der Bedingung sollte boolesch sein, d.h. wahr oder falsch.

Also schreiben wir jede Bedingung wie

%Vor%

aber wenn (Objekt) nicht eine bestimmte Bedingung ergibt, um als Boolesches Ergebnis herauszukommen.

wenn wir

schreiben %Vor%

dann wird es vollkommen in Ordnung sein.

Aber um zu sehen, ob irgendein Objekt Null ist oder nicht, können wir nicht schreiben, wenn (Objekt) wir es schreiben müssen als ob (Objekt == null) oder wenn (Objekt! = null), weil solche Bedingungen resultieren boolesches Ergebnis.

    
gprathour 21.11.2011 13:51
quelle

Tags und Links