Utilisation du Sealed en C#

Récemment au boulot on s’est posé la question de l’utilisation de sealed. Il est apparu que presque personne ne l’utilisait vraiment.

Objectif principal

L’objectif principal de sealed est de pouvoir interdire d’hériter de la classe qui le porte. Dans le cas d’une équipe développant une DLL et qui la met à disposition d’autres équipes on peut imaginer un scénario dans lequel on ne souhaite pas que les autres équipes puissent étendre nos classes via l’héritage.

La logique voudrait que tant qu’une classe n’est pas dérivée il est préférable qu’elle soit marquée comme sealed. D’ailleurs en inspectant les classes du framework .Net on se rend compte que beaucoup sont sealed.

Impact

Un impact moins connu mais très intéressant est le fait que l’utilisation d’une classe sealed permet de lever des erreurs de cast à la compilation et non à l’éxécution.

Prenons pour exemple ce bout de code suivant :

public class PremierTest
{
}

public interface ITest1
{
}

Et maintenant dans le main :

        static void Main(string[] args)
        {
            PremierTest p1 = new PremierTest();
            ITest1 p2 = (ITest1)p1;
        }

A vu d’œil on sait que ceci n’est pas possible, en effet notre classe n’implémente pas l’interface définie. L’application compilera sans problème mais à l’exécution nous obtiendrons une vilaine InvalidCastException.

Maintenant nous allons modifier la classe PremierTest pour qu’elle soit marquée comme sealed.

    public sealed class PremierTest
    {
    }

Désormais lors de la compilation notre cast va être vu comme impossible et va générer une erreur :
UtilisationSealedCapture1

 

En effet le compilateur sait que notre classe ne peut pas être castée en ITest1 car son arbre d’héritage est totalement connu vu qu’aucune autre classe ne peut en hériter grâce à sealed.

On voit donc que l’utilisation du sealed peut amener une certaine sécurité dans l’application