【发布时间】:2013-05-20 02:02:21
【问题描述】:
正如标题所说:我需要一个用于 C#/.net 代码的 NDepend 规则 (CQLinq),只要使用 ==(参考比较)比较给定类型的实例,就会触发该规则。换句话说,我想强制程序员使用.Equals。
请注意,所讨论的类型没有重载的相等运算符。
这可能吗?如果是这样,怎么做? :)
谢谢,干杯, 蒂姆
【问题讨论】:
标签: reference comparison warnings equality ndepend
正如标题所说:我需要一个用于 C#/.net 代码的 NDepend 规则 (CQLinq),只要使用 ==(参考比较)比较给定类型的实例,就会触发该规则。换句话说,我想强制程序员使用.Equals。
请注意,所讨论的类型没有重载的相等运算符。
这可能吗?如果是这样,怎么做? :)
谢谢,干杯, 蒂姆
【问题讨论】:
标签: reference comparison warnings equality ndepend
使用下面的代码,查看值类型,== 转换为 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) }
这似乎工作得很好:)
【讨论】:
operator == 实现的类?