6 votes

Avertissement 'Protected member in sealed class' (une classe singleton)

J'ai implémenté une classe singleton et je continue à recevoir l'avertissement qu'une méthode que j'écris est un "nouveau membre protégé déclaré dans une classe seal". Cela n'affecte pas la construction mais je ne veux pas vraiment ignorer l'avertissement au cas où cela poserait des problèmes plus tard ? Je comprends qu'une classe scellée est une classe qui ne peut pas être héritée - donc ses méthodes ne peuvent pas être surchargées, mais je ne comprends toujours pas pourquoi le code suivant me donne l'avertissement (est-ce dû à l'utilisation du design singleton ?):

namespace WPFSurfaceApp
{
public sealed class PresentationManager
{
    PresentationManager()
    {
    }

    protected void MethodName()
    {
    }

    public static PresentationManager Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly PresentationManager instance = new PresentationManager();
    }
}

EDIT : L'avertissement concerne la méthode MethodName(). EDIT : Changez public void MethodName() en protected void MethodName()

19voto

James Michael Hare Points 19077

Cet avertissement est dû au fait que protected n'a pas de sens dans une classe dont on ne peut pas hériter. Logiquement, elle sera exactement la même que private pour un sealed classe.

Il ne s'agit pas d'une erreur en soi, mais le compilateur essaie d'attirer votre attention sur le fait que le faire protected au lieu de private ne vous apportera aucun avantage et ne fera peut-être pas ce que vous vouliez (si vous vouliez qu'elle soit visible par une sous-classe, ce qui ne peut pas exister dans une classe scellée).

Donc, oui, vous pouvez l'ignorer sans risque, mais c'est logiquement incohérent d'avoir protected membres dans un sealed classe.

Entrée MSDN pour Avertissement du compilateur CS0628

4voto

Haris Hasan Points 17497

C'est évident car cela n'a aucun sens. Quelle sera l'utilité du membre protégé si la classe ne peut être héritée ?

Comme MSDN Dit

Les types déclarent des membres protégés afin que les types qui en héritent puissent accéder ou remplacer le membre. Par définition, vous ne pouvez pas hériter d'un type scellé ce qui signifie que les méthodes protégées des types scellés ne peuvent pas être appelées.

2voto

Jon Hanna Points 40291

Pensez au moment où vous révisez vous-même le code. Vous voyez quelque chose qui n'a aucun sens, à votre avis. Il y a quelques possibilités :

  1. Le développeur a fait une bêtise.
  2. Le développeur a fait quelque chose de trop intelligent pour que son but soit évident pour vous.
  3. Le développeur a fait quelque chose de raisonnable qui n'a plus de sens en raison des changements intervenus entre-temps.
  4. Le développeur a fait quelque chose qui n'a pas encore de sens, mais qui en aura si un changement planifié se produit.

Dans le premier cas, ils devraient le réparer.

Dans le second cas, ils doivent le documenter.

Dans le troisième cas, ils devraient le modifier ; cela fera peu de différence en pratique, mais le code aura plus de sens et les performances pourront s'en trouver légèrement améliorées.

Dans le quatrième cas, ils doivent le documenter pour l'instant, et soit effectuer ce changement, soit faire marche arrière le plus tôt possible.

Dans tous les cas, vous devriez en discuter avec eux.

C'est la même chose ici, cela n'a aucun sens d'ajouter un membre protégé à une classe scellée. Je n'ai aucune idée de la raison pour laquelle vous l'avez fait, et je ne peux pas décider lequel des quatre cas ci-dessus s'applique, mais l'un d'entre eux le fait. L'avertissement le souligne. Faites celle des quatre actions qui s'applique en fonction du cas qui est en vigueur.

0voto

Parul Points 1

Je dis que vous jouez avec C#. Sérieusement ! !
Dans une classe statique, il est dit que l'on ne peut pas déclarer de membres protégés car les classes statiques ne peuvent pas être instanciées. En fait, lorsque nous écrivons des membres protégés dans des classes statiques, une erreur est générée lors de la construction.
Dans une classe scellée, cela déclenchera un avertissement lors de la construction. Je suppose que comme les classes statiques, les classes scellées devraient également donner un ERREUR et non un AVERTISSEMENT. Si cette différence doit être présente, pourquoi ?

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