.NET Console(控制台应用)是最基础的 .NET 项目类型,无GUI、基于命令行交互,适合工具脚本、后台服务原型、学习调试、批量处理程序。
支持 .NET Framework / .NET Core / .NET 5+(现在主流是 .NET 6/7/8,顶级语句模板是默认模板)
一、两种项目模板对比
模板1:顶级语句(.NET 6+ 默认,推荐新手)
自动隐藏 Program 类和 Main 方法,代码简洁,不需要手动写入口。
// Program.cs
Console.WriteLine("Hello .NET Console");
string input = Console.ReadLine();
Console.WriteLine($"你输入:{input}");
本质:编译器自动生成 Program 类和 Main 入口,只是简化写法。
模板2:传统完整模板(.NET 5及以前,老项目、需要多入口时用)
显式 Program + Main,适合理解底层入口机制
using System;
namespace ConsoleDemo
{
class Program
{
// 程序入口,Main 必须是 static
static void Main(string[] args)
{
Console.WriteLine("传统模板");
}
}
}
string[] args:命令行启动参数,程序启动时从命令行传入> > 例如:ConsoleDemo.exe -name=test,args数组拿到"-name=test"
二、创建项目(CLI命令,跨平台 Windows/Linux/Mac)
前提:安装对应版本 .NET SDK
# 1. 创建控制台项目
dotnet new console -n ConsoleDemo
# 2. 进入项目目录
cd ConsoleDemo
# 3. 编译并运行
dotnet run
# 4. 发布(生成可独立运行程序)
# 依赖框架发布(体积小,目标机器需要装.NET运行时)
dotnet publish -c Release
# 独立发布(自带运行时,目标机器不用装.NET)
dotnet publish -c Release --self-contained true -r win-x64
项目文件 ConsoleDemo.csproj 核心说明
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType> <!-- Exe = 可执行程序;Library是类库 -->
<TargetFramework>net8.0</TargetFramework> <!-- 目标框架 -->
<ImplicitUsings>enable</ImplicitUsings> <!-- 隐式using,不用写using System等 -->
<Nullable>enable</Nullable> <!-- 可空引用类型 -->
</PropertyGroup>
</Project>
Sdk="Microsoft.NET.Sdk":.NET 新式SDK风格(区别于老 .NET Framework 的 Sdk=“Microsoft.NET.Sdk.Web” 等)OutputType=Exe:代表这是可执行程序,有入口点;类库是Library,不能直接运行
三、控制台核心API(System.Console)
| 方法 | 作用 |
|---|---|
| Console.WriteLine() | 输出一行,自动换行 |
| Console.Write() | 输出,不换行 |
| Console.ReadLine() | 读取一行用户输入,返回string;回车结束 |
| Console.ReadKey() | 读取单个按键,不等待回车 |
| Console.Clear() | 清空控制台窗口 |
| Console.ForegroundColor | 设置文字颜色 |
| Console.BackgroundColor | 设置背景色 |
| Console.Exit(0) | 退出程序;0代表正常退出,非0代表异常 |
示例:颜色+按键
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("绿色文字");
Console.ResetColor(); //恢复默认颜色
Console.WriteLine("按任意键退出");
Console.ReadKey();
四、命令行参数 args 使用
// 顶级语句模板直接使用 args
if(args.Length > 0)
{
Console.WriteLine($"收到参数:{args[0]}");
}
else
{
Console.WriteLine("没有传入参数");
}
运行方式:
dotnet run -- hello 123
# args = ["hello", "123"]
--是分隔符,告诉dotnet run后面的参数传给你的程序,不是dotnet命令本身。
五、控制台项目生命周期
- 程序启动 → CLR加载程序集
- 执行入口方法(Main / 顶级语句)
- 顺序执行代码;遇到异步代码会有差异
- 所有主线代码执行完毕,程序退出> > ⚠️ 控制台默认:主线程执行完就退出;如果开后台任务,需要手动阻塞(
Console.ReadLine()/Wait())
异步 Main(非常常用)
很多场景需要调用异步方法,顶级语句天然支持await;传统写法可以写 static async Task Main
// 顶级语句
await Task.Delay(1000);
Console.WriteLine("等待1秒完成");
传统模板异步入口:
static async Task Main(string[] args)
{
await Task.Delay(1000);
}
六、依赖管理(NuGet包)
控制台项目可以像Web项目一样引入NuGet
# 添加包
dotnet add package Newtonsoft.Json
引入后直接在代码使用,csproj自动增加PackageReference节点。
七、控制台常见使用场景
- 批量数据处理工具(文件导入导出、ETL小脚本)
- 单元测试/原型验证(快速测试C#代码、算法)
- Windows/Linux 定时任务脚本(配合计划任务、Crontab)
- 简易客户端,调用WebApi、数据库
- 学习C#基础,不用理解GUI复杂机制
八、控制台项目局限性
- 没有界面,只能文本交互
- 默认没有内置日志框架(需要引入Serilog/NLog)
- 不适合长时间后台常驻服务(长时间后台优先用 Worker Service)> > 👉 区分:Console 临时工具;Worker Service 是 .NET 官方后台服务模板(Windows服务/Linux守护进程)
九、常见坑
- 中文乱码:Windows控制台默认GBK,.NET默认UTF8。”` Console.OutputEncoding = System.Text.Encoding.UTF8; Console.InputEncoding = System.Text.Encoding.UTF8;
- 异步代码直接
await,主线程跑完程序直接退出,还没等异步任务完成。 ReadLine()输入null:控制台被重定向输入时会出现。- 发布:区分框架依赖和独立发布,部署时容易忘记安装运行时。