Duplicar posible:
C#: Best practice for validating “this” argument in extension methodsElección de diseño: ¿deseo que los métodos de extensión arrojen excepciones en nulo?
estoy ambivalente sobre una opción de diseño, y le gustaría conocer las opiniones de la comunidad SO. El ejemplo que menciono aquí es solo un posible caso en el que se debe hacer esta elección de diseño: en realidad, podría haber muchos más casos. Las respuestas son bienvenidas tanto a este caso específico como a un enfoque más general, y también se agradecen las pautas sobre cómo tomar la decisión en un caso específico.
Básicamente, quiero saber cómo pensar acerca de esto: Al escribir un método de extensión que no falla intrínseca si una referencia nula se pasa como el this
ejemplo, se debe realizar una comprobación nula en el argumento o no ?
Ejemplo:
Estoy escribiendo un método de extensión en IEnumerable<T>
que recorrer la colección y performe algunos Action<T>
- Básicamente, esto es lo que va a hacer:
public static void Each<T>(this IEnumerable<T> collection, Action<T> action)
{
foreach (var t in collection)
{
action.Invoke(t);
}
}
Lo que no puedo decidir es qué debe hacer este método de extensión si se pasa null
a cualquiera de los parámetros. Si no agrego ninguna comprobación nula, obtendré un NullReferenceException
en action.Invoke(T)
, pero si collection
es null
, el bucle for simplemente no hará nada en silencio (y no se lanzará ninguna excepción incluso si action
es también action
...).
Estoy bastante decidido a agregar un cheque nulo para action
, por lo que puedo lanzar un ArgumentNullException
en lugar del NullReferenceException
. Pero, ¿qué quiero hacer con el collection
?
Opción 1: Agregue un cheque nulo, y arroje ArgumentNullException
.
Opción 2: Simplemente deje que el método no haga nada en silencio.
¿Cuál será más útil donde podría querer usar el método en el futuro? ¿Por qué?
Si la colección es nula, también obtendrá una NullReferenceException del bucle foreach. – m0sa
Solo por cierto: sabes que LINQ proporciona un ForAll (o algo por el estilo), que hace exactamente lo que quieres (¿hasta donde puedo ver?). No es que tenga algo que ver con su pregunta, y esto podría ser solo un ejemplo de su parte, pero podría tratar de ver qué hace LINQ-extension-methods cuando los da nulos, y tal vez copie eso. ¿Sigue los patrones de MS cuando escribe C#? – Alxandr
@bzlm: ¿Cómo funciona eso? ¿O es solo para colecciones/enumerables? – Alxandr