不要在密封类型中声明受保护的成员
更新: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()
{
}
}
}