2010-07-13 6 views
16

Estoy usando ReSharper 5.0, y me pregunto cómo su función de análisis de código sabe resaltar el siguiente assemblies == null con el comentario "La expresión siempre es falsa".¿Cómo sabe ReSharper que este tipo de devolución nunca es nulo?

var directory = new DirectoryInfo("somedir"); 
FileInfo[] assemblies = directory.GetFiles("*.dll"); 

if (assemblies == null <<--- this is highlighted with "Expression is always false" 
    || assemblies.Length == 0) 
{ 
    _log.Warn("No assemblies found"); 
} 

Entiendo si el tipo de devolución es un tipo de valor, que no lo es. También entiendo si hubo algún tipo de contrato de código o metadatos que indica que .GetFiles() nunca devolverá nulo. pero no creo que exista

Entonces, ¿cómo sabe esto? ¿Me estoy perdiendo algo obvio, o ReSharper tiene algún conocimiento privilegiado, como una lista interna de metadatos sobre los métodos de framework? ¿O es realmente "introspect" el código interno y resolverlo?

+2

Podrían haber examinado la documentación: "Si no hay archivos, este método devuelve una matriz vacía". – stuartd

+11

Oh sí, simplemente llamaron a omniscienceHelper.ReadDocs() – heisenberg

Respuesta

25

Los desarrolladores de ReSharper corrieron el análisis de flujo en los binarios de .NET framework y determinaron qué métodos pueden o no devolver null. Aparentemente DirectoryInfo.GetFiles nunca devuelve null.

Puede anotar su propio código para indicar el mismo conjunto de reglas, con un conjunto de atributos JetBrains.. Echar un vistazo en el sitio ReSharper: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

Editar: Para responder a su pregunta en concreto, "no ReSharper tiene algún conocimiento privilegiado, tales como una lista interna de metadatos sobre métodos marco" - sí, se trataba de "introspección el código interno y resolverlo "

+0

tiene sentido, gracias por la respuesta. –

+2

La "advertencia" parece sugerir que elimine la expresión 'assemblies == null'. Sin embargo, si se generó al observar el código implementado, no es necesariamente un contrato de código documentado en el que me gustaría confiar. – intoOrbit

+0

Depende de usted; He verificado las advertencias de Resharper las suficientes veces en el pasado que ahora confío en él. Además, nunca se puede garantizar que todos los tipos de referencia sean no nulos todo el tiempo, así que en lugar de poner controles '== null' en todas partes, los dejo fuera y me aseguro de que el código falle tan pronto como sea posible. –

3

Como Tim señala, anotamos el .NET Framework. Es similar a lo que obtienes con los Contratos de Código, pero hecho de forma un poco diferente. Si miras debajo de la carpeta bin en la instalación de ReSharper, puedes ver todas las anotaciones.

+0

@Hadi: Por favor absténgase de usar un bloque de firma. Su gravatar y un enlace a su perfil ya están adjuntos a cada publicación. Puede agregar cualquier información adicional que desee a su perfil. –

+0

Tengo curiosidad: ¿cómo reuniste la información para esas anotaciones? ¿Hiciste un análisis estático de los binarios de BCL, como sugiere la respuesta aceptada? ¿O lo hiciste de otra manera? –

+1

@Bill - En general estoy de acuerdo con su punto sobre Sigs. Sin embargo, en este caso, subraya la autoridad con la que habla Hadi, ya que trabaja para JetBrains. Posiblemente, una línea adicional para decirlo en un inglés sencillo podría haber sido más apropiada, pero el sig sí se agregó a su respuesta. –

Cuestiones relacionadas