最近,我在接受采访时遇到了以下问题。最初我认为这个问题是错的,但面试官提到有一个解决方案。鉴于此课程:
public class BaseHome
{
public static void Main()
{
Console.WriteLine("A");
}
}
将以下内容写入控制台:
B
A
C
规则:
如何做到这一点?
答案 0 :(得分:49)
假设您的意思是三行上的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();
}
}
}
答案 1 :(得分:25)
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
}
}
答案 2 :(得分:17)
没有新类型。没有显式创建对象。适用于真正的控制台应用程序。
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")
中的类型作为属性 shadow 这里的类型;这就是System.Console用于引用Console类本身的原因。
Console get-property导致写入控制台的副作用 - 它写入“__C”然后使用CR(回车)“返回行开始”并写入“B”,因此该行为“B_C” “,将光标留在”B“之后。
该属性然后返回具有WriteLine的TextWriter associated with the console。然后调用TextWriter's WriteLine,而不是Console的静态WriteLine,并写入字符“A”(在“B”之后),结果为“BAC”。
这利用特定于上下文的行为,因为它是understands how to move the cursor的控制台(例如带有“\ r”或其他光标定位)。
答案 3 :(得分:13)
只需要一个静态构造函数:
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
,抛出未处理的异常,或者只是永久旋转,而不是重定向输出流。目前还不清楚该程序是否需要正常终止(或根本不需要)。
答案 4 :(得分:5)
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");
}
}