使c#函数非私有,将其标记为final,或密封其声明类型

本文关键字:final 记为 类型 声明 密封 函数 | 更新日期: 2023-09-27 18:13:31

我正在维护一些旧的c#代码,不能过多地改变它的结构。我试图以一种安全的方式减少一些现有的编译器警告。某些函数给出了以下警告:

警告CS0108 '函数(字符串,字符串)'隐藏继承的成员'xyz。函数(字符串,字符串)"。如果要隐藏,请使用new关键字。

我认为隐藏继承函数是有意为之,因为该软件已经成功使用多年了。我认为添加"new"关键字使此函数声明为

没有害处。
private new void Function(string parm1, string parm2)

警告如预期的那样消失了,但是这个出现了:

警告CA2222使'Function(string, string)'非私有,将其标记为final,或密封其声明类型。这个方法最初是在基类'BaseClassName'中定义的。

除了抑制这个警告,我不确定什么是最安全的(即不改变行为)选项提供给我?我不认为我应该使这个方法非私有(我认为这意味着"公共")。我不确定如何使其最终或密封,以及这样做是否将是正确的解决方案。

使c#函数非私有,将其标记为final,或密封其声明类型

除非可以通过反射访问该方法,否则请删除"new"关键字,然后重新命名它(也更改任何调用站点)。该方法是私有的,所以它只能在同一个类中使用,除非它是由委托传递的(然后名称无关紧要),或者如果使用反射来访问它。

在假设代码是正确的情况下,对该方法的任何调用都是有意的。尽管我会检查它们并检查是否有任何错误,即调用站点调用了错误的方法。


对方法可见性的任何改变都是有问题的,所以要避免这样做。关于创建类sealed,这也是一个破坏性的更改,因为可能存在从类继承的第三方代码,所以也要避免。

※:可见度的降低是最糟糕的,因为可能存在使用成员的第三方代码,所以这是一个破坏性的更改。增加可见性(例如将私有方法设置为protected或public)可能会破坏类型的封装,暴露成员可能会允许第三方代码扰乱该类型对象的状态,因此要小心。

您可以忽略警告-它被错误地触发。也就是说,private new有点像代码的味道,可能预示着更深层次的问题。

请看这里关于它发生的原因的解释。它担心有人会出现并覆盖你的new方法。

如果必须更改访问修饰符,要么将方法标记为final,要么对其类型进行密封,以防止该方法被覆盖。

然而,c#中的方法默认是final的。将方法标记为密封(在其他语言中也称为final) c#只会阻止进一步的重写。

这个警告只适用于你的新方法:

public/protected/internal virtual new void Function(string parm1, string parm2)
在这种情况下,解决方案是删除virtual关键字