2009-03-01 10 views
16

Ich habe gerade gesehen, es wurde in einer der letzten Antworten mit:implizite Operator

public static implicit operator bool(Savepoint sp) 
{ 
    return sp != null; 
} 

Warum brauchen wir Wort implizite hier, und was bedeutet es?

Antwort

28

Implizit bedeutet, dass für die Konvertierung keine Umwandlung in Ihren Code erforderlich ist.

Sie können dies jetzt tun:

Savepoint point = new Savepoint(); 
if(point) // becomes a bool using your operator 
{ 
} 

statt, dies zu tun zu haben:

Savepoint point = new Savepoint(); 
if((bool)point) // an "explicit" conversion 
{ 
} 

Ein Beispiel, warum dies ist eine nützliche Unterscheidung numerische Typen sind. Es gibt eine implizite Konvertierung von „kleineren“ Typen „größerer“ Typen zB:

float f = 6.5; 
double d = f; // implicit conversion 

Aber Umwandlung größere Typen auf kleinere Typen kann gefährlich sein, so gibt es nur eine explizite Konvertierung, den Benutzer zu zwingen, dass er zu klären, wirklich beabsichtigt, den fraglichen Vorgang auszuführen:

long l = 20; 
// short s = l; 
short s = (short)l; // explicit conversion 
+0

Sie haben Ihre Wörter in der expliziten Zahlen Casting verwechselt. "kleinere Typen in größere Typen umwandeln" sollte genau andersherum sein. – Samuel

+0

Danke. Ich habe meinen Fehler behoben. – mquander

+0

Float ist kleiner als doppelt, oder? – configurator

2

Nur um mquanders Antwort hinzuzufügen.

Von der C# 3.0 -Programmiersprachenspezifikation:

A Umwandlungsoperator Erklärung, dass das implicit Schlüsselwort enthält führt eine benutzerdefinierte implizite Konvertierung. Implizite Konvertierungen können auftreten in einer Vielzahl von Situationen, einschließlich Funktion Elementaufrufe, Cast Ausdrücke und Zuordnungen.

(Abschnitt 10.10.3)

0

Sie müssen 'implizite' angeben, da auch dort explizit Betreiber ist.

Dies bedeutet, dass die Konvertierung zwischen Boolean und Savepoint implizit erfolgen kann, z. = versteckt.

Savepoint s = new Savepoint(); 
bool b = s; 

Explizite Umwandlung, z.B.

Savepoint s = new Savepoint(); 
bool b = (bool)s; 

Implizite Konvertierung wird häufig, wenn kein Datenverlust, das heißt Int16 (short)-Int32 (int) ist es verwendet: evident, kann auf diese Weise durchgeführt werden. Aber wenn es möglich ist, müssen Sie ihm durch explizite Konvertierung "zustimmen".

In Ihrem Fall zum Beispiel, wenn Savepoint ist nur ein

struct Savepoint 
{ 
    public bool data; 
} 

können Sie implizite Konvertierung verwenden, da kein Datenverlust ist möglich:

Savepoint s = new Savepoint(); 
s.data = true; 
bool b = s; 

ansonsten empfehle ich Ihnen ausdrücklich zu definieren Operator!

7

Das sieht aus wie Missbrauch eines impliziten Operators. Ich weiß nicht, was die Savepoint-Klasse tut, aber die Umwandlung in einen booleschen Wert erscheint nicht logisch. Die implizite Operator ermöglicht es Ihnen, zu überprüfen, ob ein Sicherungspunkt Referenz einfach null ist oder nicht die Bewertung der Referenz:

if (point) { 

statt:

if (point != null) { 

Wenn es auf diese Weise verwendet wird, dass versteckt, was der Code tut tatsächlich, und das widerspricht so ziemlich allem, worum es bei C# geht.

+0

Das ist völlig korrekt. – mquander

1

Konvertierungsoperatoren konvertieren von einem Typ in einen anderen. Implizit bedeutet, dass Sie keinen expliziten Cast-Code für die Konvertierung eingeben müssen. Explizit erfordert, dass der Cast-Code aufgerufen wird.

Sie verwenden den impliziten Konvertierungsoperator, wenn Sie sicher sind, dass die Konvertierung keine Daten verliert. Zum Beispiel mit erweiternden Nullen (int -> long, float -> double). Explizite Konvertierungsoperatoren werden verwendet, wenn ein Zustand verloren geht oder wenn der Compiler den Client-Code nicht automatisch durch Conversions an der gesamten Stelle manipulieren soll.

Eine Konvertierung wie Ihre würde wirklich verheerenden Schaden anrichten, da es nicht ratsam ist, diese spezielle Konvertierung durchzuführen.

Verwandte Themen