Las 4 de Plain Concepts

Por distintas consideraciones en el Stand de Plain Concepts del Tech Days 2008 no pudimos hacer un concurso que teníamos pensado pero ahora aprovechamos para ponerlas en Geeks.


Por supuesto sin compilar:


1º Pregunta:


¿Cuál es el resultado del siguiente fragmento de código?


class Program


{


public const string APP_ID = new string(‘a’,2);


static void Main(string[] args)


{


int total = default(Int32);


int result = (from i in Enumerable.Range(1, 10)


where (i & 1) == 1


select i


).Sum();


Console.WriteLine(“El resultado es {0}”,result);


}


}


Respuestas:


    



  1. 20

  2. 25

  3. Este código no compila

2º Pregunta:


¿Cuál es el resultado del siguiente fragmento de código?


class Program


{


static void Main(string[] args)


{


List<int> set = new List<int>();


for(int i = 0; i<10; i++)


set.Add(i);


DoSomething(set);


Console.ReadLine();


}


public static void DoSomething<T>(IList<T> set)


{


Console.WriteLine(“DoSomething<T>(IList<T> set)”);


}


public static void DoSomething<T>(params T[] items)


{


Console.WriteLine(“DoSomething<T>(params T[] items)”);


}


public static void DoSomething<T>(T item1, params T[] items)


{


Console.WriteLine(“DoSomething<T>(T item1,params T[] items)”);


}


public static void DoSomething<T>(T item1, T item2)


{


Console.WriteLine(“DoSomething<T>(T item1, T item2)”);


}


}


Respuestas:


    



  1. DoSomething<T>(IList<T> set)

  2. DoSomething<T>(params T[] items)

  3. DoSomething<T>(T item1,params T[] items)

  4. DoSomething<T>(T item1, T item2)

3º Pregunta:


¿Cuál es el resultado del siguiente fragmento de código?


class Program


{


class Customer


{


public string Name { get; set; }


}


static void Main(string[] args)


{


Customer initCustomer = new Customer();


Customer otherCustomer = SetCustomer(ref initCustomer);


Console.WriteLine(Object.ReferenceEquals(initCustomer, otherCustomer));


Console.WriteLine(Object.ReferenceEquals(initCustomer, SetCustomer(ref initCustomer)));


Console.Read();


}


static Customer SetCustomer(ref Customer c)


{


c = new Customer();


return c;


}


}


Respuestas:


    



  1. True True

  2. False False

  3. True False

  4. False True

4º Pregunta:


¿Cuál es el resultado del siguiente fragmento de código?


class Program


{


static void Main(string[] args)


{


string cadenaUno = “Plain Concepts S.L”;


string cadenaDos = “Plain Concepts S.L”;


Console.WriteLine(Object.ReferenceEquals(cadenaUno,“Plain Concepts S.L”));


Console.WriteLine(Object.ReferenceEquals(cadenaUno, cadenaDos));


Console.ReadLine();


}


}


Respuestas:


    



  1. True True

  2. False False

  3. True False

  4. False True

[EDITADO]


P.D: Por cierto desde aquí las gracias a Octavio y Yamil que colaboraron activamente en el “pensamiento” 🙂 de las preguntas


 


 

14 comentarios sobre “Las 4 de Plain Concepts”

  1. No soy una máquina lo que pasa es que era muy tarde y no vi que no valía compilador, lo siento.

    ¿Todavía no entiendo la 2, alguien se ofrece a explicarla?

  2. Bueno, ya que me he picado y me estoy tomando un café…

    1. No compila porque el extension method .Sum( ) devuelve un double y se intenta asignar implícitamente en un int.

    2. Por inferencia de tipos de parámetros, como al método genérico no le pasamos el argumento de tipo lo infiere del parámetro que pasamos, el param array es opcional, así que entra por ahí. ( Me explico como un libro cerrado, y más en castellano con estos términos )

    3. Aquí habría fallado, cuanta cantidad de detallitos 🙂 .La diferencia entre pasar por referencia Customer es que puedes modificar la referencia en sí misma, sin ese ref los cambios en el Customer se verían pero no la modificación de la referencia.

    Mi perdición ha sido que cuando se hace la segunda comparación. Los parámetros entran en la pila por órden por lo que no son iguales, para demostrarlo cambiamos el órden y ponemos antes la llamada a la función.

    4. La 1, son la misma referencia porque estarán Interned . Que alguien me explique el método String.IsInterned( string s ) y porque no devuelve un bool 🙂

  3. Ok, APP_ID al ser const puedes asignarle un literal constante, pero no una instancia de un string, debería ser static readonly . Curioso en el caso de los strings.

    Pero vamos, la asignación de double Sum( ) en un int también es un error de compilación, así que reclamo medio minipunto 🙂

  4. Pablo Alarcon:

    Lo siento pero no hay medio puntito

    IEnumerable.Sum() devuelve en una de sus sobrecargas int por lo que eso si compila Palo.

  5. 1. Creo recordar que no se puede hacer una asignación a const cuando el valor no es otro constante, una de las diferencias con readonly (una, no todas)

    El resto…ya lo miraré.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *