Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 重载方法给出;带有可选参数的方法被重载“隐藏”;重拾器中的警告_.net_Resharper_Overloading_String.format_Resharper 7.1 - Fatal编程技术网

.net 重载方法给出;带有可选参数的方法被重载“隐藏”;重拾器中的警告

.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) {..}

我有一些C#应用程序可以做日志记录,输出方法有一个重载来接受消息和一个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 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。我的想法有点不同,但是在你解释之后,很明显这个方法是隐藏的,所以这个警告确实有意义。