c# oop puzzle

c# - Interesante rompecabezas de OOPS



puzzle (5)

Recientemente, me enfrenté a la siguiente pregunta en una entrevista. Inicialmente pensé que la pregunta era incorrecta, pero el entrevistador mencionó que hay una solución para esto. Dada esta clase:

public class BaseHome { public static void Main() { Console.WriteLine("A"); } }

Escriba lo siguiente en la consola:

B A C

Reglas:

  1. No cambie la función principal.
  2. No crees ninguna clase adicional.

¿Cómo puede hacerse esto?


Jajaja, lo descubrí. Crea una propiedad estática!

public class BaseHome { public static void Main() { Console.WriteLine("A"); } public static BaseHome Console { get{ return new BaseHome(); } } public void WriteLine(string s) { System.Console.WriteLine("BCA"); //Or multiple lines if you like } }

Edición: O, duh, sólo un campo

public class BaseHome { static BaseHome Console = new BaseHome(); public static void Main() { Console.WriteLine("A"); } public void WriteLine(string s) { System.Console.WriteLine("BCA"); //Or multiple lines if you like } }


No hay nuevos tipos. No hay objetos creados explícitamente. Funciona en una aplicación de consola real.

public class BaseHome { static System.IO.TextWriter Console { get { System.Console.Write(" C/rB"); return System.Console.Out; } } public static void Main() { Console.WriteLine("A"); // System.Console.ReadLine(); } }

El resultado es BAC : ¡en la misma línea, no menos!

(Esto se puede adaptar a múltiples salidas de línea, por la edición posterior, con el uso de CurstorLeft/Top o secuencias de escape directo).

Explicación:

La propiedad estática ( Console ) se resuelve en lugar del tipo en Console.WriteLine("A") ya que la propiedad sombrea el tipo aquí; esta es la razón por la que se utiliza System.Console para referirse a la propia clase de consola.

La propiedad get de la consola causa un efecto secundario de escribir en la consola: escribe "__C", luego usa CR (retorno de carro) para "volver al inicio de la línea" y escribe "B", por lo que la línea es "B_C", dejando El cursor después de la "B".

La propiedad devuelve el TextWriter asociado a la consola que tiene WriteLine. La WriteLine del TextWriter , no la WriteLine estática de la consola, se invoca y se escribe el carácter "A" (después de "B"), por lo que el resultado es "BAC".

Esto utiliza un comportamiento específico del contexto porque es la consola la que entiende cómo mover el cursor (por ejemplo, con "/ r" u otro posicionamiento del cursor).


Solo se necesita un constructor estático:

public class BaseHome { static BaseHome() { Console.WriteLine("B/nA/nC"); Console.SetOut(System.IO.TextWriter.Null); } public static void Main() { Console.WriteLine("A"); } }

En lugar de redirigir el flujo de salida, otras opciones incluyen llamar a Environment.Exit , lanzar una excepción no controlada o simplemente girar para siempre. No está claro si el programa debe terminar normalmente (o no).


Suponiendo que se refirió a BAC en tres líneas (más ningún error tipográfico en el nombre del método main ):

namespace ConsoleApplication1 { public class BaseHome { static BaseHome() { Console.WriteLine("B"); AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); } public static void Main() { Console.WriteLine("A"); } private static void OnProcessExit(object sender, EventArgs e) { Console.WriteLine("C"); Console.Read(); } } }


struct ConsoleStruct { private string _text; public ConsoleStruct(string text) { _text = text; } public void WriteLine(string txt) { Console.WriteLine(_text); } } class Program { private static ConsoleStruct Console = new ConsoleStruct("B A C"); static void Main(string[] args) { Console.WriteLine("A"); } }