重载方法在Resharper中给出“带有可选参数的方法被重载隐藏”警告

时间:2013-05-14 15:11:19

标签: .net resharper overloading string.format resharper-7.1

我有几个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来构建一个带有指定参数的字符串?

1 个答案:

答案 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评论并让你的代码保持原样可能是“好的”。