可以使用CQL查找返回“null”的方法吗?

时间:2015-07-17 14:59:07

标签: cql ndepend

我想找到所有可以显式返回null的方法。

这可以在使用CQL的NDepend中实现吗?

1 个答案:

答案 0 :(得分:2)

目前还没有,CQL到目前为止还不知道返回的变量,字段和值的值。

但是,建议使用以下默认规则。这个想法是,如果一个方法返回一个引用,它应该永远不为null,并且应该添加一个契约来断言它。如果您希望这样的方法返回null,请使用TryParse(string s, out T val):bool模式,例如// <Name>Public methods returning a reference needs a contract to ensure that a non-null reference is returned</Name> warnif count > 0 let ensureMethods = Application.Methods.WithFullName( "System.Diagnostics.Contracts.__ContractsRuntime.Ensures(Boolean,String,String)") from ensureMethod in ensureMethods from m in ensureMethod.ParentAssembly.ChildMethods where m.IsPubliclyVisible && !m.IsAbstract && m.ReturnType != null && // Identify that the return type is a reference type (m.ReturnType.IsClass || m.ReturnType.IsInterface) && !m.IsUsing(ensureMethod) && // Don't match method not implemented yet! !m.CreateA("System.NotImplementedException".AllowNoMatch()) select new { m, ReturnTypeReference = m.ReturnType } //<Description> // **Code Contracts** are useful to decrease ambiguity between callers and callees. // Not ensuring that a reference returned by a method is *non-null* leaves ambiguity // for the caller. This rule matches methods returning an instance of a reference type // (class or interface) that don't use a **Contract.Ensure()** method. // // *Contract.Ensure()* is defined in the **Microsoft Code Contracts for .NET** // library, and is typically used to write a code contract on returned reference: // *Contract.Ensures(Contract.Result<ReturnType>() != null, "returned reference is not null");* // https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 //</Description> //<HowToFix> // Use *Microsoft Code Contracts for .NET* on the public surface of your API, // to remove most ambiguity presented to your client. Most of such ambiguities // are about *null* or *not null* references. // // Don't use *null* reference if you need to express that a method might not // return a result. Use instead the **TryXXX()** pattern exposed for example // in the *System.Int32.TryParse()* method. //</HowToFix>

{{1}}