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

属性
规则 ID CA1047
标题 不要在密封类型中声明受保护的成员
类别 设计
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

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

规则说明

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

对于这种情况,C# 编译器发出警告 CS0628 而不是 CA1047。

如何解决冲突

若要解决此规则的冲突,请将成员的访问级别更改为专用,或使该类型可继承。

何时禁止显示警告

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

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(设计)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

示例

下面的示例演示了与此规则发生冲突的类型。

public sealed class SealedClass
{
    protected void ProtectedMethod(){}
}
Public NotInheritable Class BadSealedType
    Protected  Sub MyMethod
    End Sub
End Class