【问题标题】:find all occurrences of comparison with == in visual studio在visual studio中找到所有与==进行比较的地方
【发布时间】:2011-06-03 00:02:22
【问题描述】:

我犯了一个错误,使用 == 来比较 IP 地址,而不是使用 C# 中 IPAddress 类的 equals() 方法,这将导致比较引用而不是值。 由于我目前正在处理的解决方案对于一个单人项目来说非常大(> 100.000 行源代码),我非常确定我的代码中仍然存在一些错误的陈述。

是否有可能告诉 Visual Studio 为我查找特定类上所有出现的 == 操作,以便我可以找到并清理错误的比较?

最好的问候,emi

【问题讨论】:

  • 我不知道,但是您使用通用命名约定吗? IE。 IPAddress ipAddress 还是 IPAddress ip1?如果是这种情况,您可以使用通配符或正则表达式进行匹配。
  • 也许可以编写一个 stylecop 或 fxcop 插件来找到这些。
  • @Brad:我通过通配符搜索发现了一些情况,但恐怕仍然存在networkInterfaceA.Addresses[0] == networkInterfaceB.Addresses[0]等形式的比较。 :(
  • @CodeInChaos 我认为这是一个不错的提示,我想到了一个 Resharper hack

标签: c# visual-studio-2008 ip-address equals


【解决方案1】:

这有点小技巧,但您可以暂时将此类添加到您的项目中:

namespace System.Net
{
    class IPAddress
    {
        [Obsolete]
        public static bool operator ==(IPAddress a, IPAddress b) { return true; }
        [Obsolete]
        public static bool operator !=(IPAddress a, IPAddress b) { return true; }
    }
}

编译并查找有关使用过时方法的警告:

警告 'IPAddress.operator ==(IPAddress, IPAddress)' 已过时

修复代码后,删除类定义。

【讨论】:

  • 天才+1:这是一个非常简单有效的解决方案,是最好的解决方案。
  • +1 并被接受。你太棒了。 :)。我将您的类的文件放入我的项目中,并将其命名空间更改为 System.Net。我能够通过搜索“过时的”编译器错误来追踪所有比较。非常感谢!
  • 虽然我也想过这个问题,但它有一个问题:它只有在你明确声明了IPAddress 类型的变量时才有效,并且如果第三方库返回IPAddress 则不起作用它仍然是真实的。
  • (IPAddress,object)(object,IPAddress) 重载它应该会捕获更多,但可能仍然不是全部。
  • 我项目的前首席开发人员覆盖 == 来检查值而不是相等性,这使得空值检查变得不可能。这应该非常有助于解决这个问题。 +1
【解决方案2】:

您始终可以在“==”上使用查找/替换。您可以使用过滤器来确定要搜索的内容/位置,或者只使用整个解决方案。

【讨论】:

  • 老兄,这是一个非常简单的解决方案,OP 已经知道了 :-)
  • 我猜到了——但把它扔在那里了。你永远不知道。
  • 我更倾向于使用“查找所有引用”来查找 IPAddress 的实例。
【解决方案3】:

您可以使用 .NET Reflector 或 Visual Studio 调用层次结构窗口来查找对 IPAdress 类的 operator== 方法的调用。不知道这是否可行,只是抛出一个想法。

【讨论】:

  • 如果我对 .NET Reflector 有足够的经验,我会尝试这个的……不过还是谢谢。
【解决方案4】:

如果您知道代码中代表 IP 地址的变量的名称,那么是的,有一些解决方法是可能的。假设您的变量名为“ipAddress”。然后这样做:

使用通配符搜索:

ipAddress*==

然后循环遍历结果并创建一个宏来为您进行更改。例如,假设您的语句如下所示:

if (ipAddress == anotherIpAddress) {

然后你做一个微如下:

Start Recording
Press Home              # This will go to the beginning of the line
Ctrl+Right Three Times  # This will keep the cursor on the beginning of anotherIpAddress
Backspace               # This will remove the space
.equals(                # This will write .equals(
Del Three Times         # This will delete the == and the space after it
Ctrl+Right              # This will keep you at the closing bracket ).
)                       # This will write another closing bracket for the equals functions.
Stop Recording

现在您有了一个可以为您更改行的宏。您所要做的就是反复按 F4,然后按 Ctrl^P。按 F4 将您移至 Find in Files 中的下一个结果(我想您将使用它),然后按 Ctrl^P 执行宏。

实际上使用正则表达式有更好的解决方案,但我不确定它是否适用于 Visual Studio。基本上,它将查找中的元素分组并在替换中使用它们。因此,您搜索“ipAddress == ()”之类的内容并将其替换为“ipAddress.equals(\1)”,这里指的是第一组。

希望有帮助!

【讨论】:

  • 谢谢,但问题是,有许多不同的变量名称和许多不同的模式,例如 networkInterfaceA.Addresses[0] == networkInterfaceB.Addresses[0]。
【解决方案5】:

您可以继承 IPAddress 并覆盖 == 运算符。这当然取决于您更换参考文献的难易程度。完成此操作后,您可以停在那里或将 == 运算符的所有实例替换为 .Equals()

【讨论】:

  • 这是一个不错的想法,我认为这个想法与 Mark 的解决方案结合起来会有很大的潜力。谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多