我有几个C#应用程序执行日志记录,并且Output方法有一个重载来接受消息和一个StreamWriter,另一个重载带有一个params数组的附加参数。签名方法的一个例子是:
private static void Output(string message, StreamWriter writer, params object[] args)
{..}
private static void Output(string message, StreamWriter writer)
{..}
问题涉及Resharper对这些方法发出以下警告:" 带有可选参数的方法被重载隐藏 "。
该警告具有误导性,因为我从3 param重载内部调用2-param重载并且它不会导致递归调用,因此不会隐藏重载。
我对Resharper网站进行了一些研究,并且在此问题上已经开通了一些已关闭的门票,因为"无法修复"。
在我看来,这是一个有效的用例,因为运行时知道调用哪个重载。 .NET框架中也有一些示例,它们使用这种重载。
例如,StreamWriter.WriteLine()
包含要写入的值的重载,以及Format params
。
这是一个有效的参数,还是应该将我的方法重命名为" OutputFormat"因为在幕后他们使用string.Format来构建一个带有指定参数的字符串?
答案 0 :(得分:22)
据我所知,你的帖子中有两个问题。
首先,如果您认为您的方法可以重命名为更明显的方法,那么这将改善您的代码在许多方面(可读性,可用性等),无论如何尽可能地描述他们的所作所为。
第二次,关于Resharper警告:
使用重载函数的递归不一定暗示或导致您看到的警告。
您可能知道,当函数的参数具有不同的类型时,最常使用的是重载函数,但函数执行相同的操作,例如:
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("my message");
隐藏了带有可选参数的函数。
因此,您可以简单地合并它们:
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") {...}
即使遇到这种情况,您也会遇到同样的问题。
IMO,一个好的经验法则是问自己几个问题:
如果你对所有人回答是,那么忽略Resharper评论并让你的代码保持原样可能是“好的”。