1. Console.ReadLine与WriteLine基础解析
在C#控制台应用程序开发中,Console.ReadLine()和Console.WriteLine()是最基础也最常用的输入输出方法。这两个方法属于System命名空间下的Console静态类,无需实例化即可直接调用。
Console.ReadLine()的工作机制是从标准输入流(通常是键盘)读取用户输入,直到遇到换行符(Enter键)为止。它会将输入内容作为字符串返回,但不包含最后的换行符。当输入流结束时(如文件结束或用户按下Ctrl+Z),该方法会返回null。这个方法在同步模式下会阻塞当前线程,直到用户完成输入。
Console.WriteLine()则用于向标准输出流(通常是控制台窗口)写入数据,并在末尾自动添加换行符。它有多个重载版本,可以输出各种类型的数据:
csharp复制Console.WriteLine(); // 仅输出换行
Console.WriteLine("Hello World"); // 输出字符串
Console.WriteLine(42); // 输出整数
Console.WriteLine("Value is {0}", someValue); // 格式化输出
2. 输入输出重定向与高级用法
Console类不仅限于简单的键盘输入和屏幕输出,它还支持输入输出流的重定向,这为更复杂的应用场景提供了可能。
2.1 流重定向实战
通过Console.SetIn()和Console.SetOut()方法,我们可以改变标准输入和输出的来源:
csharp复制// 将输出重定向到文件
using (StreamWriter writer = new StreamWriter("output.txt"))
{
Console.SetOut(writer);
Console.WriteLine("这行文字会被写入文件而非控制台");
}
// 恢复标准输出
StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
2.2 读取多行输入的技巧
处理多行输入时,通常使用循环结构:
csharp复制Console.WriteLine("请输入多行内容(空行结束):");
string line;
while (!string.IsNullOrEmpty(line = Console.ReadLine()))
{
// 处理每一行输入
Console.WriteLine($"你输入了:{line}");
}
2.3 格式化输出的高级应用
Console.WriteLine支持丰富的格式化选项:
csharp复制DateTime now = DateTime.Now;
Console.WriteLine("当前时间:{0:yyyy-MM-dd HH:mm:ss}", now);
Console.WriteLine("十六进制:{0:X}", 255);
Console.WriteLine("货币格式:{0:C}", 123.45);
3. 常见问题排查与性能优化
3.1 输入缓冲区限制
Console.ReadLine默认使用256字符的缓冲区,这意味着单行输入最多只能包含254个字符(剩余2个给换行符)。要处理更长的行,需要重新配置标准输入:
csharp复制// 扩大输入缓冲区至1024字符
StreamReader reader = new StreamReader(Console.OpenStandardInput(),
Encoding.UTF8,
false,
1024);
Console.SetIn(reader);
3.2 异步处理的注意事项
虽然Console类提供了ReadLineAsync方法,但在控制台应用中它实际上仍然是同步执行的:
csharp复制// 这个异步调用实际上会阻塞
var input = await Console.In.ReadLineAsync();
真正的异步输入处理需要使用更低级的API或专门的输入库。
3.3 错误处理最佳实践
健壮的输入处理应该包含错误处理:
csharp复制try
{
Console.Write("请输入数字:");
string input = Console.ReadLine();
int number = int.Parse(input);
Console.WriteLine($"你输入的数字是:{number}");
}
catch (FormatException)
{
Console.WriteLine("输入的不是有效数字!");
}
catch (OverflowException)
{
Console.WriteLine("输入的数字超出范围!");
}
catch (IOException e)
{
Console.WriteLine($"IO错误:{e.Message}");
}
4. 实战应用场景与扩展技巧
4.1 创建交互式命令行菜单
结合Console.ReadLine和Console.WriteLine可以构建用户友好的命令行界面:
csharp复制while (true)
{
Console.Clear();
Console.WriteLine("主菜单");
Console.WriteLine("1. 选项一");
Console.WriteLine("2. 选项二");
Console.WriteLine("3. 退出");
Console.Write("请选择:");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
// 执行选项一
break;
case "2":
// 执行选项二
break;
case "3":
return;
default:
Console.WriteLine("无效选择,按任意键继续...");
Console.ReadKey();
break;
}
}
4.2 密码输入的安全处理
对于密码等敏感输入,可以使用Console.ReadKey来隐藏输入:
csharp复制Console.Write("请输入密码:");
string password = "";
while (true)
{
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
break;
password += key.KeyChar;
Console.Write("*");
}
Console.WriteLine($"\n你输入的密码长度:{password.Length}");
4.3 控制台进度条实现
通过控制光标位置,可以实现动态进度条:
csharp复制Console.Write("处理中:[ ] 0%");
for (int i = 0; i <= 100; i++)
{
Console.CursorLeft = 9 + i / 10;
Console.Write("#");
Console.CursorLeft = 15;
Console.Write($"{i}%");
Thread.Sleep(50); // 模拟处理过程
}
Console.WriteLine("\n处理完成!");
4.4 跨平台兼容性考虑
在开发跨平台应用时,需要注意:
- 换行符差异:Windows使用"\r\n",而Linux/macOS使用"\n"
- 编码问题:明确指定控制台的输入输出编码
- 功能可用性:某些Console方法在特定平台不可用
csharp复制// 设置控制台编码
Console.OutputEncoding = Encoding.UTF8;
// 跨平台换行符
Console.WriteLine("第一行{0}第二行", Environment.NewLine);
在实际项目中,我曾遇到一个案例:一个在Windows上运行正常的控制台程序,在Linux上却显示乱码。问题根源在于没有显式设置控制台编码。解决方案是添加以下代码:
csharp复制Console.OutputEncoding = Encoding.UTF8;
Console.InputEncoding = Encoding.UTF8;
这个经验告诉我,跨平台开发时不能依赖系统默认设置,必须显式指定编码等关键参数。
