我有一些做日志记录的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参数重载内部调用2参数重载,它不会导致递归调用,所以重载没有被隐藏。
我在Resharper网站上做了一些研究,有一些关于这个问题的票证被关闭为"不会修复"。
在我看来,这是一个有效的用例,因为运行时知道调用哪个重载。在。net框架中也有使用这种重载的例子。
例如,StreamWriter.WriteLine()
对要写的值有过载,Format params
也是。
这是一个有效的参数,或者我的方法应该重命名为"OutputFormat"之类的东西,因为在幕后他们使用字符串。格式建立一个字符串与指定的参数?
在我看来,你的帖子有两个问题。
首先,如果你觉得你的方法可以重命名为更明显的东西,那就继续吧,这将在许多方面(可读性,可用性等)改进你的代码,无论如何,它们应该尽可能地描述它们的功能。
第二个,关于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") {...}
即使那样,你也会遇到同样的问题。
在我看来,一个好的经验法则是问自己几个问题:
- 可选参数在哪里真的有意义吗?
- 函数真的需要保持相同的名称吗?
- 参数真的应该是可选的吗?
如果你对所有这些问题都回答是,那么忽略Resharper注释并让你的代码保持原样就可以了。
标题>