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