.net 重载方法给出;带有可选参数的方法被重载“隐藏”;重拾器中的警告
我有一些C#应用程序可以做日志记录,输出方法有一个重载来接受消息和一个StreamWriter,还有一个重载带有一个用于params数组的附加参数。方法签名的一个示例是:.net 重载方法给出;带有可选参数的方法被重载“隐藏”;重拾器中的警告,.net,resharper,overloading,string.format,resharper-7.1,.net,Resharper,Overloading,String.format,Resharper 7.1,我有一些C#应用程序可以做日志记录,输出方法有一个重载来接受消息和一个StreamWriter,还有一个重载带有一个用于params数组的附加参数。方法签名的一个示例是: private static void Output(string message, StreamWriter writer, params object[] args) {..} private static void Output(string message, StreamWriter writer) {..}
private static void Output(string message, StreamWriter writer, params object[] args)
{..}
private static void Output(string message, StreamWriter writer)
{..}
这个问题与Resharper有关,它为这些方法提供了以下警告:“带有可选参数的方法被重载隐藏。”
该警告具有误导性,因为我从3参数重载内部调用了2参数重载,它不会导致递归调用,因此重载不会隐藏
我在Resharper网站上做了一些研究,有一些关于这个问题的票证被打开,并被关闭为“不会修复”
在我看来,这是一个有效的用例,因为运行时知道调用哪个重载。在.NET framework中也有使用此类重载的示例
例如,StreamWriter.WriteLine()
具有要写入的值的重载,以及Format params
这是一个有效的参数,还是应该将我的方法重命名为类似“OutputFormat”的名称,因为它们在幕后使用string.Format来构建具有指定参数的字符串?据我所知,您的帖子中有两个问题 首先,如果您觉得您的方法可以重命名为更明显的名称,请继续,这将在许多方面(可读性、可用性等)改进您的代码,并且它们应该尽可能详细地描述它们的功能 第二个,关于重拾器警告: 使用重载函数的递归性没有必要暗示或导致您看到的警告 您可能知道,当函数的参数具有不同类型时,重载函数最常用,但函数执行相同的操作,例如:
private static void Print(int i) {...}
private static void Print(bool b) {...}
但是,如果某个函数重载,并且该重载具有完全相同的参数类型以及可选参数,则很可能存在设计问题
基本解释
如果你有这样的东西:
private static void Print(string message) {...}
private static void Print(string message, string messageDelimiter = "===\n") {...}
当您从类中调用Print函数时,因为两个函数在调用它们时的外观相同:Print(“我的消息”)代码>带有可选参数的代码被隐藏
因此,您可以这样简单地合并它们:
private static void Print(string message, string messageDelimiter = "===\n") {...}
public static void Print(string message) {...} //< As you can see this one is public
private static void Print(string message, string messageDelimiter = "===\n") {...}
此外
您可能还想做一些更聪明的事情,比如允许用户访问一个公共函数,同时使用如下可选参数限制该函数:
private static void Print(string message, string messageDelimiter = "===\n") {...}
public static void Print(string message) {...} //< As you can see this one is public
private static void Print(string message, string messageDelimiter = "===\n") {...}
publicstaticvoidprint(字符串消息){…}/<
私有静态无效打印(字符串消息,字符串消息分隔符=“====\n”){…}
即使是这样,你也会遇到同样的问题
在我看来,一个好的经验法则是问自己几个问题:
- 可选参数在哪里真的有意义吗李>
- 函数真的需要保持相同的名称吗李>
- 参数真的应该是可选的吗
如果您对所有问题的答案都是“是”,则可以忽略Resharper注释,让代码保持原样。谢谢您的解释。在我的例子中,我有一个方法将静态消息写入日志文件和控制台,还有一个方法使用参数列表写入消息,在幕后调用string.Format。我的想法有点不同,但是在你解释之后,很明显这个方法是隐藏的,所以这个警告确实有意义。