Pregunta

En Delphi, si no fue una excepción durante la construcción de un objeto:cualquier memoria asignada sería liberado y se iniciará una excepción.Por ejemplo, la siguiente era garantizado para devolver un válido Camera objeto, o lanzar una excepción:

Camera c = new Camera();

Usted nunca tenía que comprobar el resultado de la variable null:

Camera c = new Camera();
if (c == null)
   throw new Exception("Error constructing Camera") //waste of time

Es la misma verdad en el CLR?

Y hay otros syntatical constucts donde un valor de retorno está garantizado para ser válido, o lanzar una excepción?

  • La creación de estructuras (por ejemplo,Rectángulo)?
  • obtención de un miembro de una enumeración?
  • el resultado de Objeto.ToString()?
  • mathmatical operaciones?

En el caso de la realización de las matemáticas:

Int32 aspect = 1650.0 / 1080.0;
if (aspect == null) 
   throw new Exception("Division of two numbers returned null")
¿Fue útil?

Solución

Se garantiza que un constructor en .Net devolverá una instancia no nula del tipo del objeto. Que la instancia sea o no válida depende de la semántica individual del tipo.

Las excepciones lanzadas en un constructor no serán tragadas arbitrariamente por el CLR (aunque el código de usuario puede tragarlas). El CLR propagará una excepción al igual que las excepciones lanzadas en cualquier otro método y los objetos eventualmente serán recolectados adecuadamente.

En cuanto a los otros casos que mencionó

  • Creación de estructuras: las estructuras por definición nunca pueden ser nulas. Las excepciones lanzadas en el constructor se propagarán normalmente
  • Obtener un miembro de una enumeración: las enumeraciones son estructuras / tipos de valor bajo el capó y tampoco serán nulas
  • el resultado de Object.ToString (): Esto puede (y lamentablemente será) nulo. La cadena es un tipo de referencia y es perfectamente legal devolver un valor nulo de una anulación de ToString (no lo haga).
  • Operaciones matemáticas: esto depende en gran medida tanto de la configuración de desbordamiento de su proyecto como del tipo particular que se esté utilizando (integral versus punto flotante).

La pregunta matemática casi merece una respuesta por sí misma. Por un lado, el resultado de una operación matemática en tipos primitivos nunca será nulo. Pero aún puede ser inválido. Por ejemplo, el siguiente código no arrojará pero si el resultado es válido o no depende en gran medida de su escenario específico

float f1 = 1.0;
float f2 = f1 / 0;

En este punto, f2 es un valor flotante muy específico que no representa un número real. Es valido? Depende de su caso de uso.

Otros consejos

Sí.Me gustaría ponerlo de esta manera (como fallar podría significar un fallo lógico demasiado):Si un constructor no lanzar una excepción, el valor de retorno está garantizado a ser que nonull así que usted nunca tiene que realizar dicha verificación.

La creación de estructuras (por ejemplo,Rectángulo):Un struct no puede ser null en todos los (Nullable tipos se consideran tipos completamente diferentes, es decir, typeof(int?) != typeof(int)).Llamar a un constructor de una estructura iba a fallar por el lanzamiento de una excepción o devolver una instancia.

Obtención de un miembro de una enumeración:Un enum es un sólo un conjunto de constantes.No hay nada como la "obtención de un miembro en tiempo de ejecución." Es sustituido en tiempo de compilación.

El resultado de Object.ToString():Como cualquier método, puede devolver cualquier valor válido para string tipo que incluye null y también podría lanzar una excepción (en cuyo caso, no devuelve un valor).

Operaciones matemáticas:Todas las expresiones se devuelve un valor o lanzar una excepción.El valor de retorno puede ser cualquier valor válido para ese tipo (por ejemplo, Int32 nunca puede ser null).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top