核心变化: .NET6+ 默认【顶级语句模板】;.NET5及更早是传统
Program+Main模板
一、模板是什么
Console App 是 .NET 里最简单的项目模板,生成命令行可执行程序(.exe) ,无图形界面,只通过黑窗口输入输出。 用途:工具脚本、后台小工具、单元测试前置Demo、运维工具、学习C#基础语法。
区分两个模板:
- ✅ .NET6+ 默认:顶级语句模板(Top-level statements) ,代码极简
- 📜 传统模板:带 Main 方法,完整类结构,适合老项目、需要学习入口原理
二、模板1:.NET6+ 默认【顶级语句模板】
Program.cs
css
// See [https://aka.ms/new-console-template](https://aka.ms/new-console-template) for more information
Console.WriteLine("Hello, World!");
底层原理(编译器自动帮你生成)
编译器会隐式生成 Program 类+入口Main方法,你写的所有代码都放在这个自动生成的Main里面:
csharp
// 编译器幕后生成(你看不到)
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
- 自动引入隐式
using(System、System.IO、System.Console等,不用手写using) args命令行参数依然可以直接使用- 限制:不能在顶级语句里写方法定义;方法要写在顶级语句下方、类里面。
如何创建传统模板(保留Main方法)
- Visual Studio新建项目 → 附加信息 → 勾选【不使用顶级语句 Do not use top-level statements】
- CLI命令:
javascript
dotnet new console --use-program-main
生成代码:
arduino
namespace MyApp;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Main就是程序入口点 :CLR启动程序,自动调用Main。string[] args接收命令行传入参数。
三、项目文件结构(完整目录)
rust
MyConsoleApp
├─ MyConsoleApp.csproj // 项目配置文件(核心!SDK、版本、输出类型)
├─ Program.cs // 主代码文件
└─ obj/ // 编译临时文件
└─ bin/ // 编译输出目录
└─ Debug/net8.0/MyConsoleApp.exe
csproj 解析(.NET6+ SDK风格)
xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType> <!-- 输出为可执行程序(Console核心标识) -->
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <!-- 开启隐式using,顶级语句模板依赖这个 -->
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
OutputType=Exe:控制台/Windows程序;Library是类库,不能直接运行ImplicitUsings:自动引入命名空间,简化代码
.NET Framework老版本csproj是传统非SDK风格,结构完全不一样。
四、核心API(Console类常用)
arduino
Console.WriteLine("输出一行,自动换行");
Console.Write("输出不换行");
string input = Console.ReadLine(); // 读取一行输入
Console.ReadKey(); // 等待按任意键(防止运行完窗口一闪而过)
Console.ForegroundColor = ConsoleColor.Green; //文字颜色
五、两种模板对比
| 项目 | 顶级语句模板(.NET6+默认) | 传统Main模板(--use-program-main) |
|---|---|---|
| 代码量 | 极少,省去class、Main、using | 完整OOP结构,代码多 |
| 入口 | 编译器隐式生成Main | 显式 static void Main |
| 适用场景 | 快速写小工具、入门学习 | 面试、底层学习、老项目、复杂分层程序 |
| args | 直接可用 | Main参数 string\[\] args |
| 函数定义 | 函数必须写在顶级代码之后的类内 | 可直接写在Program类里面 |
六、命令行操作(dotnet CLI)
php
# 创建控制台项目(默认顶级语句)
dotnet new console -n DemoApp
cd DemoApp
# 编译
dotnet build
# 直接运行
dotnet run
# 带命令行参数运行
dotnet run -- arg1 arg2 hello
# 发布单文件exe
dotnet publish -c Release --self-contained true
七、常见坑
- 运行窗口一闪而过 :末尾加
Console.ReadKey(); - 顶级语句模板不能直接写函数:方法必须封装到class中,放在顶级语句代码下方
- 命令行参数
args:顶级模板可直接读取if(args.Length>0) - 不要混淆:Console App 是Exe;Class Library类库是dll,没有入口,不能直接运行
ImplicitUsings=false时,顶级模板依然可以用,但要手动写using System;