1

正如标题所说:我需要一个用于 C#/.net 代码的 NDepend 规则(CQLinq),只要使用 ==(参考比较)比较给定类型的实例,就会触发该规则。换句话说,我想强制程序员使用.Equals。

请注意,所讨论的类型没有重载的相等运算符。

这可能吗?如果是这样,怎么做?:)

谢谢,干杯,蒂姆

4

1 回答 1

1

使用下面的代码,查看值类型,==转换为 IL 指令:ceq. 使用 NDepend 无法检测到这种用法。

     int i = 2;
     int j = 3;
     Debug.Assert(i == j);
     var s1 = "2";
     var s2 = "3";
     Debug.Assert(s1 == s2);

但是对于引用类型,我们可以看到一个名为的操作符方法op_Equality被调用。

 L_001d: call bool [mscorlib]System.String::op_Equality(string, string)

因此,我们只需要一个 CQLinq 查询,它首先匹配所有名为的方法op_Equality,然后列出这些方法的所有调用者。这看起来像:

let equalityOps = Methods.WithSimpleName("op_Equality")
from m in Application.Methods.UsingAny(equalityOps)
select new { m, 
             typesWhereEqualityOpCalled = m.MethodsCalled.Intersect(equalityOps).Select(m1 => m1.ParentType) }

这似乎工作得很好:)

在此处输入图像描述

于 2013-05-25T15:55:00.917 回答