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 天前
.NET 11 - 尝试一下Minimal API中的异步验证新特性
microsoft·微软·c#·asp.net·.net·.netcore
无风听海1 天前
深入理解.NET中的 Lazy<T>
服务器·php·.net
海盗12341 天前
微软技术日报 2026-10-14:十月补丁 1411 个漏洞,.NET 11 交出 RC2
人工智能·microsoft·机器人·aigc·.net
学以智用1 天前
.NET WinForms / WPF / Blazor 模板详解
.net
黄一一9112431 天前
吾爱大佬开发,离线可用!PDF文件处理工具,本地网页版文件-浏览器里就能搞定,所有操作系统可用
windows·安全·阿里云·pdf·.net·开源软件
慧都小妮子2 天前
MSG 附件太占内存?Aspose.Email for .NET 26.9 延迟加载
c#·.net·aspose·内存优化·延迟加载·aspose.email·附件内存
学以智用2 天前
ASP.NET Core 项目模板详解:Web应用 / Web API / MVC / Razor Pages
.net
IT规划师3 天前
MQTT实战 - 用了8年MQTT,我为什么还要重新系统啃一遍(一)
物联网·.net
邹肖桥3 天前
使用S7.net动态库对西门子Plc S7-1200进行通讯操作
.net