有趣的OOPS谜题

本文关键字:谜题 OOPS | 更新日期: 2023-09-27 18:07:25

最近,我在一次面试中遇到了以下问题:起初我认为这个问题是错误的,但是面试官提到有一个解决方案。给定这个类:

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

将以下内容写入控制台:

B
A
C

规则:

  1. 不修改Main功能。
  2. 不要创建任何额外的类。

如何做到这一点?

有趣的OOPS谜题

假设您的意思是B A C在三行(加上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();
        }
    }
}

哈哈哈,我明白了。创建一个静态属性!

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
    }
}

编辑:或者,废话,只是一个字段

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
    }
}

无新增类型。没有显式创建对象。

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();
    }
}

结果是BAC -在同一行不少于!

(这可以适应多行输出,根据后期编辑,使用CurstorLeft/Top或直接转义序列。)


解释:

静态属性(Console)被解析,而不是Console.WriteLine("A")中的类型,因为属性遮蔽了这里的类型;这就是为什么系统。Console用于引用Console类本身。

控制台get属性导致写入控制台的副作用-它写入"__C",然后使用CR(回车)"返回到行开始"并写入"B",因此行是"B_C",将光标留在"B"之后。

该属性然后返回与具有WriteLine的控制台关联的TextWriter。然后调用textwwriter的WriteLine,而不是Console的静态WriteLine,并写入字符"A"(在"B"之后),因此结果是"BAC"。

这利用了上下文特定的行为,因为它是了解如何移动光标的控制台(例如,使用"'r"或其他光标定位)。

只需要一个静态构造函数:

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

不重定向输出流,其他选项包括调用Environment.Exit,抛出未处理的异常,或者只是永远旋转。目前还不清楚程序是否需要正常终止(或者根本不需要)。

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");
    }
}