opérateur implicite
-
11-09-2019 - |
Question
Je viens de voir qu'il utilisait dans l'une des réponses récentes:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Pourquoi avons-nous besoin mot implicite ici, et qu'est-ce que cela signifie?
La solution
Implicite signifie que la conversion ne nécessite pas une distribution dans votre code.
Vous pouvez maintenant faire ceci:
Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}
au lieu d'avoir à faire ceci:
Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}
Un exemple de pourquoi il en est une distinction utile est les types numériques. Il y a une conversion implicite de types « petits » à des types « grands », par exemple:
float f = 6.5;
double d = f; // implicit conversion
Mais la conversion de types plus grands à des types plus petits peuvent être dangereux, donc il n'y a qu'une conversion explicite, ce qui oblige l'utilisateur à préciser qu'il a vraiment l'intention d'effectuer l'opération en question:
long l = 20;
// short s = l;
short s = (short)l; // explicit conversion
Autres conseils
Cela ressemble à une mauvaise utilisation d'un opérateur implicite. Je ne sais pas ce que la classe ne du point de sauvegarde, mais la conversion à un booléen ne semble pas logique. L'opérateur implicite vous permet de vérifier si une référence est nul ou point d'enregistrement non en évaluant simplement la référence:
if (point) {
au lieu de:
if (point != null) {
S'il est utilisé de cette façon, qui se cache ce que le code est en train de faire, et qui va à l'encontre à peu près tout ce que C # est sur le point.
Il suffit d'ajouter à la réponse de mquander.
A partir de la spécification du langage C # 3.0:
Une déclaration de l'opérateur de conversion comprend le mot-clé
implicit
introduit un implicite défini par l'utilisateur conversion. Les conversions implicites peuvent se produire dans une variété de situations, y compris les appels de fonction de membre, jeter les expressions et les affectations.
(section 10.10.3)
Opérateurs de conversion convertissent d'un type à l'autre. signifie implicitement que vous n'avez pas à taper un casting explicite dans le code pour la conversion arriver, explicite exige CAST dans le code à appeler.
Vous utilisez l'opérateur de conversion implicite lorsque vous êtes certain que la conversion ne perd pas de données. Par exemple, avec l'élargissement de coercitions (int -> long, float -> double). opérateurs de conversion explicites sont utilisés quand un état est perdu ou vous ne voulez pas compilateur visser automatiquement le code client en insérant des conversions dans tous les sens.
Une conversion comme la vôtre serait vraiment faire des ravages car il est déconseillé d'effectuer cette conversion particulière.
Vous devez spécifier « implicite », car il y a aussi des opérateurs explicites.
Cela signifie que la conversion entre booléenne et un point d'enregistrement peut être effectuée implicitement, par exemple, = Caché.
Savepoint s = new Savepoint();
bool b = s;
Conversion explicite, par exemple évident, peut être fait de cette façon:
Savepoint s = new Savepoint();
bool b = (bool)s;
La conversion implicite est souvent utilisé quand il n'y a pas de perte de données possible, à savoir Int16 (short)
à Int32 (int)
. Mais s'il est possible, vous devez « d'accord » avec l'aide de conversion explicite.
Dans votre cas, par exemple, si Savepoint
est juste un
struct Savepoint
{
public bool data;
}
vous pouvez utiliser la conversion implicite, car aucune perte de données est possible:
Savepoint s = new Savepoint();
s.data = true;
bool b = s;
sinon, je vous recommande de définir l'opérateur explicite!