Frage

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

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

Warum brauchen wir Wort implizite hier, und was ist das?

War es hilfreich?

Lösung

Implizite bedeutet, dass die Umwandlung nicht eine Besetzung in Ihrem Code erforderlich ist.

Sie können dies jetzt tun:

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

statt, um dies zu tun:

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ößere“ Typen, z:

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

Aber Umwandlung größere Typen auf kleinere Typen können gefährlich sein, so gibt es nur eine explizite Konvertierung, zwingen den Benutzer zu verdeutlichen, dass er wirklich die betreffende Operation ausführen will:

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

Andere Tipps

Das sieht aus wie Missbrauch eines impliziten Operator. Ich weiß nicht, was die Klasse Savepoint tut, aber es zu einem boolean Umwandlung scheint nicht logisch. Die implizite Operator ermöglicht es Ihnen, zu überprüfen, ob ein Sicherungspunkt Referenz einfach null ist oder nicht die Referenz Bewertung:

if (point) {

statt:

if (point != null) {

Wenn es auf diese Weise verwendet wird, dass versteckt, was der Code tatsächlich tut, und das geht gegen so ziemlich alles, was C # über ist.

Nur um mquander Antwort hinzuzufügen.

Von der C # 3.0-Sprachspezifikation:

  

Ein Umwandlungsoperator Feststellung, dass   umfasst das implicit Schlüsselwort   führt eine benutzerdefinierte implizite   Umwandlung. Implizite Konvertierungen können   treten in einer Vielzahl von Situationen,   einschließlich Funktionselement Invokationen,   werfen Ausdrücke und Zuweisungen.

(Abschnitt 10.10.3)

Conversion Operatoren konvertieren von einem Typ in einen anderen. Implizit bedeutet, Sie müssen nicht eine explizite Umwandlung in Code für die Umwandlung Typen zu geschehen, explizit verlangt, dass Guss in Code aufgerufen werden.

Sie verwenden implizite Konvertierung Operator, wenn Sie sicher sind, dass die Umwandlung keine Daten verlieren. Zum Beispiel mit Verbreiterung Nötigungen (int -> long, float -> double). Explizite Konvertierungsoperatoren verwendet werden, wenn einige Zustand verloren gehen oder Sie nicht wollen, Compiler automatisch Client-Code vermasseln durch Umwandlungen der ganzen Ort eingesetzt wird.

Eine Umwandlung wie würde Ihnen wirklich verheerend, weil es nicht ratsam ist, diese besondere Konvertierung durchführen.

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

Das bedeutet, dass die Konvertierung zwischen Boolean und Savepoint kann implizit erfolgen, z.B. = Versteckt.

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

Explizite Umwandlung, z.B. evident, kann auf diese Weise durchgeführt werden:

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

Die implizite Konvertierung oft verwendet wird, wenn es kein möglicher Datenverlust ist, das heißt Int16 (short) Int32 (int). Aber wenn es möglich ist, müssen Sie agree damit explizite Konvertierung verwendet wird.

In Ihrem Fall zum Beispiel, wenn Savepoint ist nur ein

struct Savepoint
{
  public bool data;
}

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

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

ansonsten empfehle ich Ihnen, expliziten Operator zu definieren!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top