2012-01-11 38 views
6

Implementé una clase singleton y continúo recibiendo la advertencia de que un método que estoy escribiendo es un 'nuevo miembro protegido declarado en una clase de sello'. No está afectando la compilación pero realmente no quiero ignorar la advertencia en caso de que cause problemas más adelante. Entiendo que una clase sellada es una clase que no se puede heredar, por lo que sus métodos no pueden anularse, pero todavía no entiendo por qué el siguiente código me daría la advertencia (¿se debe al uso del diseño singleton?):'Miembro protegido en clase sellada' advertencia (una clase 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(); 
    } 
} 

EDITAR: La advertencia se refiere al método MethodName(). EDITAR: Cambiar void public MethodName() a void protegido MethodName()

+0

¿Qué ocurre si haces que la clase 'Anidada' sea 'privada'? –

+3

No veo nada protegido allí ... –

+0

No pasó nada, las advertencias siguen allí. Creo que para ser honesto, no va a tener nada que ver con el diseño singleton; tiene más que ver con modificadores cerrados de clase y acceso, pero pensé que lo mencionaría e incluiría el código de clase anidado de todos modos por si acaso. –

Respuesta

14

La advertencia es porque protected no tiene sentido en una clase que no se puede heredar. Lógicamente será exactamente igual que private para una clase sealed.

No es un error, per se, pero el compilador está tratando de llamar su atención sobre el hecho de que al hacerlo protected en lugar de private no le proporcionará ningún beneficio y puede que no esté haciendo lo que pretendía (si lo deseaba ser visible para una subclase, que no puede existir en una clase sellada).

Así que, sí, puede ignorarlo con seguridad, pero es lógicamente inconsistente tener miembros protected en una clase sealed.

entrada de MSDN para Compiler Warning CS0628

+0

Gracias James, lo entiendo ahora. Es solo que no tiene sentido protegerlo de cualquier clase infantil, ya que no lo tendrá. Pensé que podría haber sido una advertencia de algo que podría haber salido mal en lugar de codificar sin sentido. Debería haber sabido eso. Me confundí porque la advertencia todavía estaba allí una vez que la cambié al público, incluso después de varias compilaciones. Gracias amigo. –

4

Es obvio, ya que no tiene ningún sentido. ¿Cuál será el uso del miembro protegido si la clase no puede ser heredada

Como MSDN Dice

Tipos declaran los miembros protegidos de manera que los tipos que heredan pueden acceder o anular el miembro. Por definición, no puede heredar de un tipo sellado , lo que significa que los métodos protegidos en los tipos sellados no pueden llamarse .

2

Piense cuando revisa el código usted mismo. Ves algo que no tiene sentido por lo que puedes ver. Hay algunas posibilidades probables:

  1. El desarrollador ha hecho algo tonto.
  2. El desarrollador ha hecho algo demasiado inteligente para que su propósito sea obvio para usted.
  3. El desarrollador hizo algo razonable que ya no tiene sentido debido a los cambios que tuvieron lugar mientras tanto.
  4. El desarrollador hizo algo que todavía no tiene sentido, pero lo hará si ocurre un cambio planificado.

En el primer caso, deberían arreglarlo.

En el segundo caso, deben documentarlo.

En el tercer caso, deberían cambiarlo; hará poca diferencia práctica, pero el código tendrá más sentido y puede tener algún beneficio de rendimiento menor.

En el cuarto caso, deberían documentarlo por el momento, y hacer ese cambio o retroceder más temprano que tarde.

De cualquier manera, desearía discutirlo con ellos.

Es lo mismo aquí, no tiene sentido agregar un miembro protegido a una clase sellada. No tengo idea de por qué lo hiciste, y no puedo decidir cuál de los cuatro casos anteriores se aplica, pero uno de ellos sí. La advertencia resalta esto. Haga cualquiera de las cuatro acciones aplicadas de acuerdo con cuál de los cuatro casos está en vigencia.

0

Digo que estás jugando con C#. Seriamente !!
En una clase estática, se dice que no podemos declarar miembros protegidos ya que no se pueden crear instancias de clases estáticas. De hecho, cuando escribimos miembros protegidos en clases estáticas lanzará un error durante la compilación.
En una clase sellada, lanzará una advertencia durante la compilación. Supongo que al igual que las clases estáticas, las clases selladas también deberían dar un ERROR y no una ADVERTENCIA. Si esta diferencia debería estar allí, ¿por qué?

Cuestiones relacionadas