visual valores valor validar tipo tener solo que puede objeto nulo lectura implicitamente debe convertir bool acepta c# null

c# - valores - Está pasando nulo a un método aceptable



nullable c# (5)

¿Estás diciendo "está bien pasar un nulo como un parámetro a un método?"

Si es así, sí, es perfectamente aceptable.

Sin embargo, en el mundo .Net 4.0, es posible que desee considerar el uso de parámetros opcionales para que ni siquiera necesite pasar el nulo, simplemente puede omitirlo.

En el mundo de pre .Net 4.0, si es un escenario común pasar este valor nulo en un método, es posible que desee crear una sobrecarga que no tome el argumento en absoluto.

Null es un tipo de datos extraño para mí, parece que está mal usarlo, tal vez sean los errores de puntero nulos que recibí tan a menudo como un principiante que ahora me tienen asociando cualquier instancia de null a algún tipo de maldad.

De todos modos mi pregunta es

en algunos casos, ¿está bien usar null como parámetro? por ejemplo, un método puede necesitar a y b para realizar una tarea, pero en algunos casos solo puede necesitar a. ¿Está el análisis en nulo correcto para b en esas extrañas instancias y si (b == nulo) sabemos qué lo llamó?

¿O estoy de paso aquí?

Debo admitir que lo que me hizo preguntarme si esto era aceptable era que el método en cuestión podría ser superpuesto, pero tendría una diferencia de posiblemente 5 o 6 líneas de todo el método. Esto me hizo preocuparme por la duplicación de código.


Eso es perfectamente aceptable. Si está utilizando C # 4.0 también puede hacer que el parámetro sea opcional para que la persona que llama no necesite especificar el valor predeterminado.



Yo diría que esto no está bien. Pasar null por ahí nunca es una buena práctica, y en mi opinión cada vez que un valor tiene nulo, debería ser una excepción. Es posible que no siempre tenga control sobre cómo se pasan sus datos y, en esos casos, debe verificar la nulidad en caso de que ocurra. Sin embargo, si tiene la opción de controlar los argumentos usted mismo, debería sobrecargar el método, en lugar de pasar nulo.

Considere la siguiente situación:

public string DoSomething(string a, string b) { // Returns something after a and b is processed. }

En este ejemplo, estamos indicando que a y b son cadenas. Son objetos de tipo char [] o como quiera definir una cadena. Pasar un nulo en este método no tiene ningún sentido, ya que estamos esperando cadenas. Un nulo no es nada, no es una cadena vacía, es simplemente vacío.

La razón por la que digo que no creo que sea preferible enviar un null a un método es porque nunca hay usos para null . Es simplemente un vacío que queda allí como un marcador de posición para algo que no pudo instalarse. Por lo tanto, llamando al método anterior de esta manera:

DoSomething ("lo que sea", nulo) no tiene ningún sentido.

Podríamos argumentar que podríamos hacer algo como esto:

/// <summary> /// Does something with string a or b /// </summary> /// <param name="a">The first string. If it''s null, nothing is done with it</param> /// <param name="b">The second string. If it''s null, nothing is done with it</param> /// <returns></returns> public string DoSomething(string a, string b) { // Returns something after a and b is processed. }

Pero eso también hace que el código sea menos legible. ¿Por qué no hacer una sobrecarga DoSomething (cadena a)? O tal vez refactorizar el método por completo, ya que puede hacer algo con a y null y aún así devolver un valor válido. null no es un valor válido, por lo que el resultado de una operación que incluya null como argumento no debe devolver un valor válido.

Es como usar el infinito en matemáticas. Siempre obtendrá infinito como resultado si agrega / resta / multiplica o divide algo con él.

Renuncia

Estas son mis propias opiniones, y de ninguna manera la forma "correcta" de programación. Pero como la pregunta no tiene una respuesta correcta, practicaré mi derecho a la libertad de expresión :)


Está absolutamente bien pasar null a los métodos. Sin embargo, si tiene un csae donde no necesite pasar una variable, considere la sobrecarga .

La razón por la que puede pasar un nulo es porque puede tener un método con bastantes parámetros y no desea implementar todas las sobrecargas posibles.

Personalmente, no usaría parámetros opcionales : hay muchas discusiones sobre este tema debido al problema con el método como Contrato que está fuera del alcance de esta pregunta.

ACTUALIZAR

La forma correcta de hacerlo no es duplicar el código, sino dejar que las sobrecargas se llamen entre sí:

public void Foo(A a) { Foo(a, null); } public void Foo(A a, B b) { // ....... }

Esto le dirá al cliente de este código:

  • Puede llamar al método solo con A
  • Puede llamar al método con A y B

Si tengo solo el segundo método, el cliente no sabría si está bien pasar el null .