C# Console App(控制台应用)模板详解

核心变化: .NET6+ 默认【顶级语句模板】;.NET5及更早是传统 Program+Main 模板

一、模板是什么

Console App 是 .NET 里最简单的项目模板,生成命令行可执行程序(.exe) ,无图形界面,只通过黑窗口输入输出。 用途:工具脚本、后台小工具、单元测试前置Demo、运维工具、学习C#基础语法。

区分两个模板:

  1. ✅ .NET6+ 默认:顶级语句模板(Top-level statements) ,代码极简
  2. 📜 传统模板:带 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方法)

  1. Visual Studio新建项目 → 附加信息 → 勾选【不使用顶级语句 Do not use top-level statements】
  2. 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

七、常见坑

  1. 运行窗口一闪而过 :末尾加 Console.ReadKey();
  2. 顶级语句模板不能直接写函数:方法必须封装到class中,放在顶级语句代码下方
  3. 命令行参数 args:顶级模板可直接读取 if(args.Length>0)
  4. 不要混淆:Console App 是Exe;Class Library类库是dll,没有入口,不能直接运行
  5. ImplicitUsings=false 时,顶级模板依然可以用,但要手动写 using System;
相关推荐
1-1=01 天前
C# 反射
c#·.net·.netcore
一叶星殇1 天前
版本即契约:.NET 6 WebAPI 多版本治理与 Swagger 文档分治实践
mvc·.net
Jeff-Tsai1 天前
Day 9:数据与定义分家,表单不必各自建类型
.net·架构设计·erp·definition-driven
步步为营DotNet1 天前
.NET 可观测性选型:Metrics、ActivitySource、EventSource 到底该用哪个
c#·.net·metrics·可观测性
CSharp精选营1 天前
我把 Ant Design Blazor 翻了一遍:Blazor 中后台组件库到底能不能用
.net·blazor·ant design blazor·中后台系统·mudblazor
IT规划师1 天前
Redis 数据类型全解 - ZSet:两个编码,七种玩法(五)
redis·.net
rockey6272 天前
AScript之字符串模板
c#·.net·script·expression·动态脚本
玩泥巴的2 天前
源生成与 AOT 就绪的微信生态 .NET SDK:结构、能力边界与 API 定位方法
ai·微信·.net·agent·aot·roslyn
1-1=02 天前
C# 泛型
c#·.net·.netcore
有志冬瓜2 天前
.NET Framework全部版本离线下载安装教程
安全·.net·软件需求