不要在密封类型中声明受保护的成员

更新:2007 年 11 月

TypeName

DoNotDeclareProtectedMembersInSealedTypes

CheckId

CA1047

类别

Microsoft.Design

是否重大更改

原因

公共类型为 sealed(在 Visual Basic 中为 NotInheritable),并且声明了受保护的成员或受保护的嵌套类型。该规则不报告 Finalize 方法的冲突,该方法必须遵循此模式。

规则说明

类型声明受保护的成员,使继承类型可以访问或重写该成员。按照定义,不能从密封类型继承,意味着不能调用密封类型上受保护的方法。

C# 编译器为此错误发出警告。

如何修复冲突

要修复与该规则的冲突,请将成员的访问级别改为私有,或使类型可继承。

何时禁止显示警告

不要禁止显示此规则发出的警告。使类型保持当前状态可能引发维护问题,不会带来任何好处。

示例

下面的示例演示一个与该规则冲突的类型。

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

上面的密封类型声明一个受保护的成员,它无法在声明该成员的类的外部调用。

如果该方法的用途是供其他类型调用,则将其可访问性提高至 public;否则,将其可访问性降低至 private。

下面的示例通过将该方法的可访问性提高至 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()        
        {        
        }    
    }
}