N缺少IDisposable实现的CQL查询

我意识到这个问题正在寻找的查询将不足以发现IDisposable实现的每一个小问题,但是每一个早期警告都很重要,所以我会尽我所能。

我想知道是否有人提出了一个NDepend的CQL查询,它将列出所有不实现IDisposable的类,但有一个或多个字段。 一个类最终可能通过一个错误(即某人忘记检查IDisposable实现的字段类型)或通过代码演变(即某个字段中某个字段中使用的类获得IDisposable的一个错误后期日期没有更新所有用法)。

查找所有不实现IDisposable的类的简单查询是:

SELECT TYPES WHERE !Implement "System.IDisposable"

但是,这当然不会检查班级是否应该为上述规则实施IDisposable。

有没有人有这样的查询? 我仍然正在处理CQL,所以这部分没有我。


Lasse,感谢CQLinq(符合LINQ的代码规则)功能,现在可以实现应该实现IDisposable的类型匹配。 实际上现在提供了两个相关的默认规则,您可以轻松编写自己的相关规则:

  • 一次性实例字段的类型必须是一次性的
  • 具有非托管资源的一次性类型应声明终结器

  • // <Name>Types with disposable instance fields must be disposable</Name>
    warnif count > 0
    
    let iDisposable = ThirdParty.Types.WithFullName("System.IDisposable").FirstOrDefault() 
    where iDisposable != null // iDisposable can be null if the code base doesn't use at all System.IDisposable
    
    from t in Application.Types where 
       !t.Implement(iDisposable) && 
       !t.IsGeneratedByCompiler 
    
    let instanceFieldsDisposable = 
        t.InstanceFields.Where(f => f.FieldType != null &&
                                    f.FieldType.Implement(iDisposable))
    
    where instanceFieldsDisposable.Count() > 0
    select new { t, instanceFieldsDisposable }
    

    // <Name>Disposable types with unmanaged resources should declare finalizer</Name>
    // warnif count > 0
    let iDisposable = ThirdParty.Types.WithFullName("System.IDisposable").SingleOrDefault()
    where iDisposable != null // iDisposable can be null if the code base deosn't use at all System.IDisposable
    
    let disposableTypes = Application.Types.ThatImplement(iDisposable)
    let unmanagedResourcesFields = disposableTypes.ChildFields().Where(f => 
       !f.IsStatic && 
        f.FieldType != null && 
        f.FieldType.FullName.EqualsAny("System.IntPtr","System.UIntPtr","System.Runtime.InteropServices.HandleRef")).ToHashSet()
    let disposableTypesWithUnmanagedResource = unmanagedResourcesFields.ParentTypes()
    
    from t in disposableTypesWithUnmanagedResource
    where !t.HasFinalizer
    let unmanagedResourcesTypeFields = unmanagedResourcesFields.Intersect(t.InstanceFields)
    select new { t, unmanagedResourcesTypeFields }
    
    链接地址: http://www.djcxy.com/p/37719.html

    上一篇: NDepend CQL Query for missing IDisposable implementation

    下一篇: Finding all methods that handle form events using NDepend