【问题标题】:NDepend rule to warn if objects of a given type are compared using ==如果使用 == 比较给定类型的对象,NDepend 规则会发出警告
【发布时间】:2013-05-20 02:02:21
【问题描述】:

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

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

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

谢谢,干杯, 蒂姆

【问题讨论】:

    标签: reference comparison warnings equality ndepend


    【解决方案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) }
    

    这似乎工作得很好:)

    【讨论】:

    • 谢谢,Patrick,匹配“op_Equality”方法有效,我发现相同 - 不幸的是,当我想得更多时,我得出的结论是我真的需要规则“警告如果给定类型的对象使用 == 进行比较,但如果与 null 相比则不进行比较”——我认为这是不可能的。所以我通过重载等式/不等式运算符并将我的类型作为值类型处理来解决这个问题。无论如何,感谢您的努力!
    • 不客气,Tim,“但如果与null相比则不是”确实是NDepend无法匹配的东西
    • Patrick,有没有办法返回这样的结果,涉及没有明确定义 operator == 实现的类?
    • 不,这里查询依赖于调用的op_equality()方法,当没有明确定义运算符时,没有这种方法可以用NDepend CQLinq进行测试
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多