C# Language Opérateurs surchargeables


Exemple

C # permet aux types définis par l'utilisateur de surcharger les opérateurs en définissant des fonctions membres statiques à l'aide du mot clé operator .
L'exemple suivant illustre une implémentation de l'opérateur + .

Si nous avons une classe Complex qui représente un nombre complexe:

public struct Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }
}

Et nous voulons ajouter l'option permettant d'utiliser l'opérateur + pour cette classe. c'est à dire:

Complex a = new Complex() { Real = 1, Imaginary = 2 };
Complex b = new Complex() { Real = 4, Imaginary = 8 };
Complex c = a + b;

Nous devrons surcharger l'opérateur + pour la classe. Ceci est fait en utilisant une fonction statique et le mot-clé d' operator :

public static Complex operator +(Complex c1, Complex c2)
{
   return new Complex 
   { 
       Real = c1.Real + c2.Real,
       Imaginary = c1.Imaginary + c2.Imaginary 
   };
}

Les opérateurs tels que + , - , * , / peuvent tous être surchargés. Cela inclut également les opérateurs qui ne renvoient pas le même type (par exemple, == et != Peuvent être surchargés, malgré le retour des booléens). La règle ci-dessous relative aux paires est également appliquée ici.

Les opérateurs de comparaison doivent être surchargés par paires (par exemple, si < est surchargé > il doit également être surchargé).

Une liste complète des opérateurs surchargeables (ainsi que des opérateurs non surchargeables et des restrictions placées sur certains opérateurs surchargeables) peut être consultée sur MSDN - Overloadable Operators (Guide de programmation C #) .

7.0

la surcharge de l' operator is été introduite avec le mécanisme de correspondance de modèle de C # 7.0. Pour plus de détails, voir Correspondance de motif

Étant donné un type Cartesian défini comme suit

public class Cartesian
{
    public int X { get; }
    public int Y { get; }
}   

Un operator is surchargeable peut par exemple être défini pour Polar coordonnées Polar

public static class Polar
{
    public static bool operator is(Cartesian c, out double R, out double Theta)
    {
        R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
        Theta = Math.Atan2(c.Y, c.X);
        return c.X != 0 || c.Y != 0;
    }
}

qui peut être utilisé comme ça

var c = Cartesian(3, 4);
if (c is Polar(var R, *))
{
    Console.WriteLine(R);
}

(L'exemple est tiré de la documentation Roslyn Pattern Matching Documentation )