我正在维护一些旧的C#代码,并且不能过多地改变它的结构。我试图以安全的方式减少一些现有的编译器警告。某些功能给了我以下警告:
警告CS0108'函数(字符串,字符串)'隐藏继承的成员'xyz.Function(string,string)'。如果想要隐藏,请使用new关键字。
我认为隐藏该继承功能是故意的,因为该软件已成功使用多年。我发现添加“new”关键字以使此函数声明为
没有任何害处private new void Function(string parm1, string parm2)
警告按预期消失了,但是这个警告出现了:
警告CA2222使'Function(string,string)'非私有,将其标记为final,或者将其声明类型封闭。此方法最初在基类'BaseClassName'中定义。
除了抑制此警告外,我不确定对我来说最安全(即非行为改变)选项是什么?我不认为我应该将这种方法设为非私人(我认为这意味着“公开”)。我不确定如何使其成为最终或密封,以及这样做是否是正确的解决方案。
答案 0 :(得分:0)
除非通过反射访问此方法,否则请删除“new”关键字,然后将其重命名(也可以更改任何调用网站)。无论如何,该方法都是私有的,因此它应该仅在同一个类中使用,除非它由委托传递(然后名称无关紧要)或者如果使用反射来访问它。
在假设代码正确的情况下,任何调用此方法都是有意的。虽然我会检查它们并检查调用网站是否有任何错误调用错误的方法。
对方法可见性的任何改变都是有问题的,所以避免这样做※。关于创建类sealed
,它也是一个重大变化,因为可能存在从类继承的第三方代码,所以也要避免这样做。
※:可见性降低最差,因为可能存在使用该成员的第三方代码,因此这是一个重大变化。提高可见性(例如,使私有方法受保护或公开)可能会破坏类型的封装,暴露成员可能允许第三方代码混淆该类型对象的状态,因此要小心。
答案 1 :(得分:0)
你可以忽略警告 - 它被错误地触发了。也就是说,private new
有点代码味道,可能表明存在更深层次的问题。
请参阅here以获取有关其发生原因的说明。它担心会有人出现并覆盖您的new
方法。
如果您必须更改访问修饰符,则方法应标记为最终,或者应密封其类型以防止覆盖该方法。
但是,C#中的方法默认为final。将方法标记为已密封(也称为其他语言的最终方法)C#仅阻止进一步覆盖。
警告只适用于您的新方法:
public/protected/internal virtual new void Function(string parm1, string parm2)
在这种情况下,解决方案是删除virtual
关键字