Share via


Geschützte Member in versiegelten Typen nicht deklarieren

Aktualisiert: November 2007

     TypeName

DoNotDeclareProtectedMembersInSealedTypes

CheckId

CA1047

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein öffentlicher Typ ist sealed (NotInheritable in Visual Basic) und deklariert einen geschützten Member oder einen geschützten geschachtelten Typ. Diese Regel meldet keine Verstöße bei Finalize-Methoden, die diesem Muster folgen müssen.

Regelbeschreibung

Typen deklarieren geschützte Member, damit erbende Typen auf den Member zugreifen oder diesen überschreiben können. Per Definition ist es nicht möglich, von einem versiegelten Typ zu erben. Dies bedeutet, dass geschützte Methoden auf versiegelten Typen nicht aufgerufen werden können.

Der C#-Compiler gibt bei diesem Fehler eine Warnung aus.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, ändern Sie die Zugriffsebene des Members in privat, oder machen Sie den Typ erbbar.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel. Das Beibehalten des aktuellen Zustands des Typs kann Wartungsprobleme verursachen und bietet keine Vorteile.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt.

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(){}
   }
}

Der obige versiegelte Typ deklariert einen geschützten Member, der außerhalb der ihn deklarierenden Klassen nicht aufgerufen werden kann.

Wenn andere Typen die Methode aufrufen können sollen, müssen Sie ihre Zugriffsmöglichkeit auf public festlegen. Legen Sie andernfalls die Zugriffsmöglichkeit auf private fest.

Im folgenden Beispiel wird die oben erwähnte Zugriffsverletzung behoben, indem der Zugriff auf die Methode auf public festgelegt wird.

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()        
        {        
        }    
    }
}