有趣的OOPS谜题
本文关键字:谜题 OOPS | 更新日期: 2023-09-27 18:07:25
最近,我在一次面试中遇到了以下问题:起初我认为这个问题是错误的,但是面试官提到有一个解决方案。给定这个类:
public class BaseHome
{
public static void Main()
{
Console.WriteLine("A");
}
}
将以下内容写入控制台:
B
A
C
规则:
- 不修改Main功能。 不要创建任何额外的类。
如何做到这一点?
假设您的意思是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");
}
}