10 votes

If (instance) / conversion booléenne implicite sur une classe personnalisée

J'ai la classe suivante :

public class InterlockedBool
{
    private int _value;

    public bool Value
    {
        get { return _value > 0; }
        set { System.Threading.Interlocked.Exchange(ref _value, value ? 1 : 0); }
    }

    public static bool operator ==(InterlockedBool obj1, bool obj2)
    {
        return obj1.Value.Equals(obj2);
    }
    public static bool operator !=(InterlockedBool obj1, bool obj2)
    {
        return !obj1.Value.Equals(obj2);
    }
    public override bool Equals(bool obj)
    {
        return this.Value.Equals(obj);
    }
}

Ma question est la suivante : puis-je vérifier si Value est vrai, sans == true ? Le contournement de l'opérateur fonctionne, mais puis-je aussi l'utiliser comme ça ?

InterlockedBool ib = new InterlockedBool();
if (ib) { }

Au lieu de (cela fonctionne, mais normalement j'omets l'élément == true en if déclarations.

if (ib == true) { }
  1. Et comment l'affecter à une valeur sans utiliser .Value = ?

Merci pour votre aide :)

11voto

Martin Verjans Points 3165

Vous devez être capable de convertir votre objet à y de un booléen

Conversion implicite

Votre objet en un booléen :

public static implicit operator bool(InterlockedBool obj)
{
    return obj.Value;
}

Puis un booléen à votre objet :

public static implicit operator InterlockedBool(bool obj)
{
    return new InterlockedBool(obj);
}

Ensuite, vous pouvez le tester :

InterlockedBool test1 = true;
if (test1)
{
    //Do stuff
}

Conversion explicite

Si vous voulez que les utilisateurs de cette classe soient conscients qu'une conversion a lieu, vous pouvez forcer un cast explicite :

public static explicit operator bool(InterlockedBool obj)
{
    return obj.Value;
}

public static explicit operator InterlockedBool(bool obj)
{
    return new InterlockedBool(obj);
}

Dans ce cas, vous devez exprimer explicitement vos objets :

InterlockedBool test1 = (InterlockedBool)true;
if ((bool)test1)
{
    //Do stuff
}

EDIT (suite au commentaire de l'OP)

Dans la conversion du booléen à votre objet, j'appelle un constructeur que vous n'avez pas mentionné, voici comment je le construirais :

public InterlockedBool(bool Value)
{
    this.Value = Value;
}

Par conséquent, la définition de la valeur est garantie sans risque pour les fils.

6voto

devilmaster Points 439

Vous pouvez définir une conversion implicite en bool :

public static implicit operator bool(InterlockedBool obj)
{
    return obj.Value;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X