Avertissement "membre protégé dans la classe scellée" (une seule classe)

j'ai mis en place une classe singleton et 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ù il cause des problèmes plus tard? Je comprends qu'une classe sealed est une classe qui ne peut pas être héritée - donc ses méthodes ne peuvent pas être dépassées, mais je ne comprends toujours pas pourquoi le code suivant me donnerait l'avertissement (est-ce dû à l'utilisation de la conception 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 (). Modifier: remplacer public void MethodName () par protected void MethodName ()

6
demandé sur James Michael Hare 2012-01-11 19:33:06

4 réponses

L'avertissement est parce que protected n'a pas de sens dans une classe qui ne peut pas être héritée. Il sera logiquement exactement le même que private pour une classe sealed .

ce n'est pas 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 fournira aucun avantage et peut ne pas faire ce que vous avez prévu (si vous avez prévu qu'il soit visible à une sous-classe, qui ne peut pas exister dans une classe scellée).

donc, oui, vous pouvez l'ignorer en toute sécurité, mais il est logiquement incohérent d'avoir protected membres dans une classe sealed .

MSDN Entry for compilateur Warning CS0628

14
répondu James Michael Hare 2012-01-11 15:40:53

c'est évident parce que ça n'a aucun sens. Quelle sera l'utilisation du membre protégé si la classe ne peut pas être héritée

Comme MSDN Dit

Les Types

déclarent les membres protégés de sorte que les types héritiers peuvent accéder ou remplacer le membre. Par définition, vous ne pouvez pas hériter d'un sceau type, ce qui signifie que les méthodes protégées sur les types scellés ne peuvent pas être appelé.

4
répondu Haris Hasan 2012-01-11 15:46:29

pensez au moment où vous examinez le code vous-même. Vous voyez quelque chose qui n'a pas de sens aussi loin que vous pouvez voir. Voici quelques possibilités:

  1. le développeur a fait quelque chose de stupide.
  2. , Le développeur a fait quelque chose de trop intelligent pour son but d'être évident pour vous.
  3. Le développeur a fait quelque chose de raisonnable qui n'a plus de sens en raison des changements qui ont eu lieu dans le temps de le dire.
  4. le développeur a fait quelque chose qui n'a pas encore de sens, mais le fera si un changement prévu se produit.

dans le premier cas, ils devraient le fixer.

dans le second cas, ils doivent le documenter.

dans le troisième cas, ils devraient le changer; cela fera peu de différence pratique, mais le code aura plus de sens et il peut avoir un certain avantage de performance mineure.

Dans le quatrième cas, ils devraient document pour le moment, et soit à changer ou à l'arrière de plutôt tôt que tard.

de toute façon, vous voulez 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 pourquoi vous l'avez fait, et ne peut pas décider lequel des quatre cas ci-dessus s'applique, mais l'un d'eux. L'avertissement le souligne. Faire selon des quatre actions s'applique, selon laquelle de les quatre cas est en effet.

2
répondu Jon Hanna 2012-01-11 15:47:24

je dis que vous êtes jouer avec C#. Sérieusement !!

Dans une classe statique, il est dit que nous ne pouvons pas déclarer des 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, cela lancera une erreur pendant la compilation.

Dans une classe scellée, il lancera un avertissement pendant la construction. Je suppose que comme les classes statiques, les classes scellées devraient aussi donner une erreur et non un avertissement. Si cette différence devait être là, alors pourquoi?

0
répondu Parul 2012-09-27 15:12:45