Quiz sobre C#

Para los entendidos en C#, ¿Qué devuelve la siguiente función (y por qué) ?

csharp:
using System;

class Q1: System.NullReferenceException {
  static int Main() {
    try {
      string valor = "Value: " + (Q1)null;
      return valor.Length;
    }
    catch (Q1 q) {
      throw;
    }
  }
  public static string operator +(string msg, Q1 q) {
    return msg + q;
  }
}

Posibles respuestas

  • Retorna la longitud de la variable valor
  • Se produce un NullReferenceException
  • Se produce un StackOverflowException

Es una ligera adaptación del Quiz Sharp 1 de Adrian Florea

Solución

El código mostrado genera un StackOverflowException, porque la sobrecarga del operador "+" se hace sobre un objeto de tipo string en el primer sumando y un objeto de tipoQ1 en el segundo, es por eso que se hace recursivo (return msg+Q1;) como menciona Kiz.

8 Replies to “Quiz sobre C#”

  1. Genera un NullReferenceException al utilizar el operador + de la clase string entre msg y null. No estoy seguro de si el catch capturaría la excepción, pero en cualquier caso, después volvería a lanzarla así que al final siempre se genera el NullReferenceException.

  2. Pingback: Quiz sobre C#
  3. ¡Me gané una chochona! jejejeje

    Bueno creo que hay que mencionar también que no, el catch no hace captura ninguna puesto que Q1 no hereda de StackOverflowException.

    Y una custión que sería bueno resolver es ¿Cuál sería la manera de evitar este tipo de situaciones?

    A mi juicio la forma más recomendable es nunca usar el objeto completo para conseguir el resultado de una operación. En el quiz si tuviéramos algo como "Q1 a = new Q1();" y en el la asignación a valor "string valor = "Value: " + a;" también se produciría un StackOverflowException. Por eso mismo usamos el objeto Q1 en su totalidad.

    Sería algo como lo que esta implementado en el Quiz al que haces referencia. En la sobrecarga del operador "return i + q.Message.Length;" esto evita un StackOverflowException y lo que se genera es un NullReferenceException. El motivo es que se intenta llegar a una propiedad de un campo de un objeto que no ha sido inicializado "q.Message.Length". Y la forma de evitarlo vendría ser comprobar siempre que los parametros tienen lo que deben tener. O sea, hacer algo cuando se da el siguiente caso "if ((q == null)||(q.Message == null))"

  4. Lo que hay hacer es no usar sobrecarga de operadores, eso nos ahorrara dolores de cabeza.

    si la cosa hubiera sido algo como:

    public static string Sumar(string msg, Q1 q)
    { Sumar(msg,q);}

    la recursividad hubiera resultado evidente, por contra al usar sobrecarga de operadores resulta que un código realmente simple se convierte en un "quiz", conclusión, la sobrecarga de operadores sirve para generar un código más confuso, menos mantenible y más propenso a errores, mejor no usarla y escribir un método normal y corriente.

Comments are closed.