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