2011-01-25 11 views
9

Estoy tratando de descubrir las mejores prácticas para el código reutilizable que se depura fácilmente. Me encontré con una práctica común entre los desarrolladores que aún no entiendo del todo.Comprobación de Null en el Constructor

public MyConstructor(Object myObject) 
{ 
    if (myObject == null) 
     throw new ArgumentNullException("myObject is null."); 
    _myObject = myObject; 
} 

Parece casi innecesario hacer esta comprobación. Pero creo que es porque no entiendo completamente cuáles son los beneficios de hacer este control. Parece que una excepción de referencia nula sería lanzada de todos modos? Probablemente estoy equivocado, realmente me gustaría escuchar algunas ideas al respecto.

Gracias.

+0

Lo que usted está haciendo no es necesario, puede verificar antes de hacer referencia al objeto, que no fue nulo. Por supuesto, validar lo que usará cuando se inicializa su objeto es un enfoque muy válido. –

+2

@Ramhound: este es un enfoque común cuando se utilizan marcos DI como StructureMap, donde no necesariamente se tiene control directo sobre lo que se pasa al constructor. Si su clase es inútil sin 'myObject' y este es el único lugar para inicializarla, tiene sentido lanzar excepciones lo antes posible para que las conozca. En una aplicación web de larga ejecución, es posible que no conozca el problema hasta que alguien llame a un método que requiera el objeto. –

Respuesta

17

Para el compilador, null es un argumento de constructor legítimo.

Su clase podría ser capaz de manejar un valor nulo para myObject. Pero si no puede - si su clase se romperá cuando myObject es nulo - entonces el check in en el constructor le permite fail fast.

+0

Muy bien explicado. Me gustó especialmente el término "fallar rápido". Gracias por las ideas. – jsmith

+2

+1 Guau, es un excelente artículo. Gracias por el enlace. –

1

El compilador no tiene idea del valor de un objeto, por lo que debe comprobarlo en tiempo de ejecución para asegurarse de que no se invoque con un valor nulo.

También depende de su solución particular. No necesita lanzar la excepción, solo la lanzaría si no puede tener ese valor como nulo, y si es nulo, ese es un caso excepcional.

1

Creo que no es posible decir en general si es necesario o no verificar el nulo. Más bien depende de si puede vivir con variables de valor nulo o no. Nulo no es per se un mal estado. Es posible que tenga situaciones en las que se permite que una variable sea nula y otra donde no lo sea.

Pregúntese si tiene sentido permitir valores nulos o no y diseñe el constructor en consecuencia.

3

Pasar un objeto null es perfectamente legal en muchos casos - para esta clase el implementador quiere asegurarse de que no puede crear una instancia de la clase sin pasar una instancia válida de Object, por lo que no debe haber controles posteriores en - es una buena práctica para asegurar esto tan pronto como sea posible, que estaría en el constructor.

0

Necesita comprobar explícitamente null porque el compilador no lo sabe, pero también porque null puede ser un argumento válido.

0

La ventaja es que la excepción se producirá en el momento de la construcción del objeto, por lo que puede rastrear fácilmente qué parte del código es la culpable. Si el código requiere no nulo valor myobject y que no validan en el constructor, el NullReferenceException serán arrojados al utilizar myObject_ y tendrá que rastrear manualmente para ver quién envió ese valor nulo en.

1

Podría implementar un método de extensión simple ThrowIfNull para reducir el código que escribe cada vez. Jon Skeet lo cubrió en su blog y en el artículo SO here.

+0

El enlace del blog está roto, pero creo que este es el mismo artículo: http://codeblog.jonskeet.uk/2009/12/09/quot-magic-quot-null-argument-testing/comment-page-1/ –

2

si bajo 4.0 se puede hacer lo siguiente:

public ctor(IEnjection ninjaWeapon) 
{ 
    Contract.Requires<ArgumentNullException>(ninjaWeapon != null); 
    this.deadlyWeaponary.Add(ninjaWeapon); 
} 

si en virtud de una versión más antigua, hacer referencia a la Microsoft.Contract a hacer lo mismo.

+1

+1 para el uso de ninjaWeapon – ninjasense

Cuestiones relacionadas