2011-12-27 41 views
6

¿Es posible en C# saber de los documentos de MSDN que algún método/propiedad/campo puede o no puede devolver valor nulo?Asegúrese de que la propiedad no puede devolver nulo

p. Ej. Image.RawFormat Propiedad de MSDN dice:

ImageFormat que representa el formato de archivo de esta imagen.

¿Se puede devolver nulo? ¿Debo realizar tal comprobación nula en mi código o SIEMPRE no será nulo?

+0

¿Se refiere a esto: http://msdn.microsoft.com/en-us/library/system.drawing.image.rawformat.aspx? – zmbq

+0

Los contratos de código son buenos para este tipo de cosas. – Amy

+0

¿Y qué contratos de código usa MSDN? –

Respuesta

4

Creo que para cualquier entrada valor de entrada (es decir, no proporcionado por su código) debe realizar comprobaciones de validación. Incluso si ve en MSDN que no puede devolver null ahora, puede cambiar en el futuro y de todos modos es una buena práctica.

+0

¡Pero si lo hago obtendré una Cobertura de código más baja! No? –

+0

Extraño entender el uso de "cobertura de código más baja" en este hilo. esta frase, hasta donde yo sé, se refiere al nivel de prueba que le hiciste a tu código. como "¿Cuántos escenarios posibles tiene que cubrir?". de todos modos, hará que su código sea más seguro. el único inconveniente es su rendimiento de pérdida, pero es probable que sea tan bajo que no podrá medirse. –

+0

Sí, me entiendes correctamente. Cuando ejecuto alguna herramienta de cobertura de código, mido qué tan bueno es mi código probado (con algún framework xUnit), así que perderé algunos porcentajes de cobertura si tendré un código muerto que nunca será invocado y por lo tanto no estará disponible para la prueba. –

1

No creo que haya un garantizado manera de diferenciarse de la documentación, pero normalmente indicaría si puede ser nulo. Por ejemplo, si nos fijamos en la documentación de System.Windows.Documents.Inline.NextInline, que dice:

objeto Una línea que representa el siguiente elemento en línea que es un par a este elemento, o null si no hay un siguiente elemento en línea.

En cualquier caso, si el programa no puede manejar un valor null y tiene una instancia de un tipo de referencia, aún debe hacer la validación apropiada para null.

+0

Lamentablemente, lo que dices sobre MSDN no siempre se aplica. Busca, por ejemplo, en http://msdn.microsoft.com/en-us/library/ system.windows.application.current (v = vs.95) .aspx. Por supuesto, tiene sentido que la propiedad sea nula en aplicaciones que no sean de WPF, pero no se indica explícitamente allí. –

+0

@ MatějZábský: Sí, la documentación no está garantizado para ser explícito sobre esto. Parece que si es "importante" (o común) lo suficiente como para mencionar la posibilidad de nulo, estará allí. – bobbymcr

1

Resharper le advertirá cuando utilice un objeto que no se puede probar que no es nulo (por ejemplo, al mirar el atributo NotNull, o al ver que el método llamado realiza comprobaciones) y le ofrecerá discretamente agregar el cheque con un clic o dos.

De esta manera puede evitar ensuciar su código con cheques que no son necesarios.

También, a menudo usando Debug.Assert es suficiente para hacer las comprobaciones "improbables pero-que-si" (donde tiene que terminar lo que sea que el código está haciendo de todos modos).

+0

Incluso el compilador de C# le advertirá, por ejemplo 'int i = null'. – abatishchev

+1

Pero no lo advertirá en situaciones como "objeto o = nulo; str s = o.ToString()", que es lo que OP está preguntando. –

0

No hay manera de asegurarse de que un tipo que admite nulos no devuelva null; sin embargo, considere que el marco es estable en términos de cambios de código, tendré que tomar una decisión informada observando cómo la propiedad o el método son llamando funciona usando ILSpy o JustDecompile.

En su ejemplo, parece que null no se pudo devolver ya que el constructor de ImageFormat acepta un Guid y lo asigna a un campo privado.

Dependiendo de lo que está haciendo con la propiedad puede ser digno de la comprobación:

  1. Que un StatusException no se lanza sobre el acceso a la propiedad.
  2. Ese ImageFormat es igual a un formato que está esperando, ya que podría representar un formato de imagen del que ni GdiPlus ni .NET están "al tanto".
Cuestiones relacionadas