2011-03-15 6 views
7

Por ejemplo, si tengo un método definido como ...¿Hay alguna forma de marcar un método para garantizar que T no sea nulo?

T Create() 
{ 
    T t = Factory.Create<T>(); 

    // ... 

    Assert.IsNotNull(t, "Some message."); 
    // -or- 
    if (t == null) throw new Exception("..."); 
    // -or- anything that verifies that it is not null 
} 

... y yo estoy llamando a que el método de alguna otra parte ...

void SomewhereElse() 
{ 
    T t = Create(); 
    // >><< 
} 

... al >><<, Lo sé (es decir, a mí, la persona que escribió esto) que t está garantizado para no ser nulo. ¿Hay alguna manera (un atributo, quizás, que no he encontrado) de marcar un método como garantizar que un tipo de referencia que devuelve o que pasa de otra forma (tal vez un parámetro out) esté garantizado por la lógica interna para que no sea nulo?

Tengo que admitir tímidamente que ReSharper es sobre todo por lo que me importa, ya que destaca todo lo que cree que podría causar ya sea InvalidOperationException o NullReferenceException. Me imagino que está leyendo algo que puedo marcar en mis métodos o simplemente sabe que Assert.IsNotNull, comprobaciones booleanas simples o algunas otras cosas eliminarán la posibilidad de que algo sea nulo y que puede eliminar el resaltado.

¿Alguna idea? ¿Acabo de ser víctima de la enfermedad de oh-my-god-resharper-highlights-it-I-have-fix-it?

+0

también sufro de oh-my-dios-ReSharper-destacados-que-me-tienen-a enfermedad de arreglarlo. Así que no estás solo. –

Respuesta

4

Si ReSharper es por qué te importa entonces se puede marcar el método Factory.Create<T>() con su atributo [NotNull] descrito en su web help

+0

Creo que tengo miedo de su ayuda web. Esto es exactamente lo que estaba buscando. Ahora solo tengo que lidiar con el hecho de que nunca obtendré una referencia a los ensambles de Resharper en nuestra aplicación :). ¡Gracias! – Shibumi

+0

@Shibumi: de hecho muestran cómo moverse para hacer referencia a sus ensamblajes al cortar y pegar las definiciones en su código. Está en el mismo enlace. –

+0

En realidad, volvía para enmendar eso. Veo que pueden detectar la presencia del espacio de nombres y los atributos en su propio código. Sin embargo, creo que todavía tendría una venta difícil con eso: "Me gustaría agregar estos atributos extraños en nuestra base de código para que mi OCD para eliminar líneas onduladas esté satisfecho". Gracias por su ayuda, sin embargo; ¡te centraste exactamente en la respuesta que estaba buscando! – Shibumi

0

Podría fundido T a un objeto a continuación, comprobar si es nulo?

var o = (object)Factory.Create<T>(); 
if(o == null) throw new Exception(); 
1

Se puede poner una restricción en T sólo para permitir struct.

Puede usar una extensión de idioma que le permita hacer definiciones más precisas de las condiciones pre/post para su función (programación basada en contrato), como SpecSharp o Code Contracts. Code Contracts parece aprovechar los sistemas integrados de C# 4.0. No tengo experiencia con ninguno de los dos, solo he oído hablar de ellos.

+0

El problema es que tiene que ser algo que ReSharper reconoce. – Shibumi

+0

@Shibumi: Si usa uno de los métodos que sugerí para resolver el problema (que proporcionaría su propia verificación independiente, y podría garantizar esto en tiempo de compilación, aliviando su código de comprobaciones de tiempo de ejecución), definitivamente debe agregar configuraciones/pragmas a configurar ReSharper para ignorarlos. Esto se ve como los documentos correctos: http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Solution-Wide_Analysis__Configuring_Solution-Wide_Analysis.html. Siempre debe examinar y personalizar sus advertencias desde cualquier herramienta de análisis estático. –

+0

@Shibumi: Pero usted es libre de elegir la mejor solución para usted :) A menudo es mejor utilizar por completo las herramientas que ya tiene que aplicar más tecnología al problema. La respuesta de Mike dos parece buena. –

Cuestiones relacionadas