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评论并让你的代码保持原样可能"没问题".
| 归档时间: |
|
| 查看次数: |
6961 次 |
| 最近记录: |