【问题标题】:Overloaded methods give "Method with optional parameter is hidden by overload" warning in Resharper重载的方法在 Resharper 中给出“带有可选参数的方法被重载隐藏”警告
【发布时间】:2013-05-08 22:47:26
【问题描述】:

我有一些执行日志记录的 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”,因为他们在幕后使用 string.Format 来构建具有指定参数的字符串?

【问题讨论】:

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


    【解决方案1】:

    据我所知,您的帖子中有两个问题。

    首先,如果你觉得你的方法可以重命名为更明显的东西,那就继续吧,这将在许多方面(可读性、可用性等)改进你的代码,无论如何他们应该这样做尽可能详细地描述他们的工作。

    第二,关于 Resharper 警告:

    使用重载函数的递归并不一定意味着或导致您看到的警告。

    你可能知道重载函数最常用于当函数的参数有不同类型时,但函数做同样的事情,例如:

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

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

    基本解释

    如果你有这样的事情:

    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 评论并让您的代码保持原样。

    【讨论】:

    • 感谢您的解释。就我而言,我有一个方法可以将静态消息写入日志文件和控制台,还有一个方法可以写入带有参数列表的消息,在幕后调用 string.Format。我对此的想法略有不同,但在您的解释之后,很明显该方法确实是隐藏的,所以这个警告确实有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多