Condividi tramite


Non dichiarare membri protetti nei tipi sealed

Aggiornamento: novembre 2007

TypeName

DoNotDeclareProtectedMembersInSealedTypes

CheckId

CA1047

Category

Microsoft.Design

Breaking Change

Non sostanziale

Causa

Un tipo pubblico è sealed (NotInheritable in Visual Basic) e dichiara un membro protetto o un tipo nidificato protetto. Questa regola non segnala violazioni per i metodi Finalize che devono seguire questo modello.

Descrizione della regola

I tipi dichiarano membri protetti in modo che i tipi che ereditano possano accedere al membro o eseguirne l'override. Per definizione, non è possibile ereditare da un tipo sealed, pertanto non è possibile chiamare metodi protetti su tipi sealed.

Il compilatore C# genera un avviso per questo errore.

Correzione di violazioni

Per correggere una violazione di questa regola, modificare il livello di accesso del membro in privato oppure rendere ereditabile il tipo.

Esclusione di avvisi

Non escludere un avviso da questa regola. Se si lascia il tipo nello stato corrente è possibile causare problemi di gestione e non ottenere alcun vantaggio.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola questa regola.

Imports System

Namespace DesignLibrary

   Public NotInheritable Class BadSealedType
      Protected  Sub MyMethod
      End Sub
   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public sealed class SealedClass
   {
      protected void ProtectedMethod(){}
   }
}

Il tipo sealed precedente dichiara un membro protetto che non può essere chiamato fuori della classe che lo dichiara.

Se il metodo è stato progettato per essere chiamato da altri tipi, impostare l'accessibilità su Public, in caso contrario, impostarla su Private.

Nell'esempio seguente viene risolta la violazione precedente migliorando l'accesso facilitato del metodo a Public.

Imports System

Namespace Samples

   Public NotInheritable Class Book
        Protected Sub Read      
    End Sub

   End Class

End Namespace
using System;

namespace Samples
{    
    public sealed class Book     
    {        
        protected void Read()        
        {        
        }    
    }
}