C# 有趣的OOPS难题
最近,我在一次采访中遇到了以下问题。起初我认为这个问题是错误的,但面试官提到有一个解决办法。鉴于这一类别:C# 有趣的OOPS难题,c#,oop,puzzle,C#,Oop,Puzzle,最近,我在一次采访中遇到了以下问题。起初我认为这个问题是错误的,但面试官提到有一个解决办法。鉴于这一类别: public class BaseHome { public static void Main() { Console.WriteLine("A"); } } 将以下内容写入控制台: B A C 规则: 请勿更改主功能 不要创建任何其他类 如何做到这一点?没有新类型。没有显式创建对象。在真正的控制台应用程序中工作 public class Bas
public class BaseHome
{
public static void Main()
{
Console.WriteLine("A");
}
}
将以下内容写入控制台:
B
A
C
规则:
如何做到这一点?没有新类型。没有显式创建对象。在真正的控制台应用程序中工作
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
-在同一行上
(通过使用或直接转义序列,可根据后期编辑调整多行输出。)
说明: 解析静态属性(
Console
)而不是Console.WriteLine(“A”)
中的类型,因为属性在此处隐藏类型;这就是为什么System.Console用于引用Console类本身的原因
Console get属性会导致写入控制台的副作用—它写入“_C”,然后使用CR(回车)返回“行开始”,并写入“B”,因此该行为“B_C”,将光标保留在“B”之后
然后,该属性返回具有WriteLine的。然后调用,而不是控制台的静态WriteLine,并写入字符“A”(在“B”之后),因此结果是“BAC”
这利用了特定于上下文的行为,因为它是控制台(例如,带有“\r”或其他光标定位)。假设您的意思是三行上的B A C(加上
main
方法名称上没有输入错误):
只需要一个静态构造函数:
public class BaseHome
{
static BaseHome()
{
Console.WriteLine("B\nA\nC");
Console.SetOut(System.IO.TextWriter.Null);
}
public static void Main()
{
Console.WriteLine("A");
}
}
除了重定向输出流,其他选项包括调用
环境.Exit
、抛出未经处理的异常,或者只是永远旋转。现在还不清楚该程序是否需要正常终止(或完全终止)。哈哈哈,我想出来了。创建一个静态属性
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
}
}
@我也看到了。因此,解决方案可能是创建一个Main方法,不允许在键盘上键入任何内容或移动鼠标。这不是一个程序,我假设B和C是从名为BaseHome.Main的程序输出的,以提供AThis,这确实是CodeGolf.SE的一个问题。同意,这个问题很容易解决,只要让结构中的WriteLine接受一个它忽略的参数就可以了。@JanneMatikainen是的,已经解决了。还有一个比ken2k更糟糕的解决方案——不应该创建任何额外的类,这意味着在这个上下文中没有结构——是的,我认为这就是解决方案。我在考虑定时器,但这是更好的解决方案+1做得好。这项工作符合要求。+1惊人。我甚至都想不出出口!这个静态BaseHome()方法是什么?这是一个构造函数吗?@bodycountPP Ref.:“静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它。”这非常聪明!那太狡猾了。您还可以在静态构造函数中重定向控制台的输出流。看我的答案。解释,我要求一个@bodycountPP愿望实现了。这在我看来是相当巧妙的。聪明的回答。我喜欢这个,因为它表明你关注细节。
BaseHome
控制台程序/类可以很容易地成为静态的
(而且,至少在我的经验中,它通常是静态的,或者至少不被视为可实例化的类)。如果类是静态的,您可以创建一个返回匿名类型的属性,但我不知道这是否违反了do-not-create-a-class约束:public static dynamic Console{get{Action WriteLine=s=>System.Console.WriteLine(“BCA”)返回新的{WriteLine};}@Dennis_E:好主意。如果不允许匿名类型(这似乎很有道理),您可以使用!这就是为什么C#是我最喜欢的语言;这么多漂亮的特征!聪明地简单地“断开”输出。
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
}
}