5

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

我想知道是否有人为 NDepend 提出了一个 CQL 查询,该查询将列出所有未实现 IDisposable 但具有一个或多个字段的类。一个类可能会通过错误(即有人忘记检查 IDisposable 实现的字段类型)或通过代码演变(即在某个字段中使用的类在某处获得 IDisposable 附加到以后的日期,所有用法都没有更新)。

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

SELECT TYPES WHERE !Implement "System.IDisposable"

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

有没有人有这样的疑问?我仍然在掌握 CQL,所以这部分让我望而却步。

4

1 回答 1

8

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 }
于 2008-11-24T12:59:15.723 回答