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

Pla*_*tor 19 .net resharper string.format overloading 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) 
{..}
Run Code Online (Sandbox Code Playgroud)

问题涉及Resharper对这些方法给出以下警告:" 带有可选参数的方法被重载隐藏 ".

该警告具有误导性,因为我从3个param重载内部调用2-param重载并且它不会导致递归调用,因此不会隐藏重载.

我对Resharper网站做了一些研究,并且在这个问题上已经打开了一些已经关闭的门票,因为"无法修复".

在我看来,这是一个有效的用例,因为运行时知道调用哪个重载..NET框架中也有一些示例,它们使用这种重载.

例如,StreamWriter.WriteLine()要写入值的重载,以及Format params.

这是一个有效的参数,还是应该将我的方法重命名为类似"OutputFormat"的东西,因为它们在幕后使用string.Format来构建一个带有指定参数的字符串?

For*_*gic 24

据我所知,你的帖子中有两个问题.

首先,如果你觉得你的方法可能会被重命名为一些较明显的继续,这将提高你在许多方面(可读性,可用性等)的代码,他们无论如何都应该描述尽可能接近他们做什么.

第二,关于Resharper警告:

使用重载函数的递归不一定暗示或导致您看到的警告.

您可能知道,当函数的参数具有不同的类型时,最常使用的是重载函数,但函数执行相同的操作,例如:

private static void Print(int i) {...}

private static void Print(bool b) {...}
Run Code Online (Sandbox Code Playgroud)

但是,如果函数重载并且该重载具有完全相同的参数类型以及可选参数,则很可能存在设计问题.

基本解释

如果您有这样的事情:

private static void Print(string message) {...}

private static void Print(string message, string messageDelimiter = "===\n") {...}
Run Code Online (Sandbox Code Playgroud)

当您从类中调用Print函数时,因为当您调用它们时,两个函数的外观都是相同的:Print("my message");隐藏了带有可选参数的函数.

因此,您可以简单地合并它们:

private static void Print(string message, string messageDelimiter = "===\n") {...}
Run Code Online (Sandbox Code Playgroud)

此外

您也可能想要做一些更聪明的事情,比如让用户访问一个公共函数,同时限制具有可选参数的那个:

public static void Print(string message) {...} //< As you can see this one is public

private static void Print(string message, string messageDelimiter = "===\n") {...}
Run Code Online (Sandbox Code Playgroud)

即使遇到这种情况,您也会遇到同样的问题.

IMO,一个很好的经验法则是问自己几个问题:

  • 可选参数在哪里确实有意义吗?
  • 该功能是否真的需要保持相同的名称?
  • 参数应该是可选的吗?

如果你对所有人都回答" ",那么忽略Resharper评论并让你的代码保持原样可能"没问题".