Menu

C# Hello World:Main、Console.WriteLine 与 ReadLine

逐行讲解你的第一个 C# 程序:Main 方法,Console.WriteLine 和 Write,用 Console.ReadLine 读取输入,注释,用 dotnet CLI 创建和运行项目,以及顶级语句。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

经典的第一个程序会输出一行文本。在 C# 中它是这样的:

输出:

Hello, World!

逐行讲解

  • using System; 让你可以写 Console,而不必写完整名称 System.Console。Console 是 System 命名空间中的一个类(参见命名空间与 using)。
  • class Program 声明一个类。所有 C# 代码都写在某个类型内部;Program 这个名字只是惯例,并不是强制要求。
  • static void Main() 是入口点。程序启动时,运行时会查找名为 Main 的静态方法并调用它。static 表示它属于类本身,所以不需要先创建对象。void 表示它不返回任何值。
  • Console.WriteLine("Hello, World!"); 用一个字符串参数调用 WriteLine 方法。每条语句都以分号结尾。
  • 花括号 { } 标出类和方法的主体。

C# 区分大小写。console.writeline 和 main 与 Console.WriteLine 和 Main 是不同的名称,而且这两个名称都不存在。

Console.WriteLine 与 Console.Write

WriteLine 在文本后面加一个换行符。Write 不加,所以下一次输出会接在同一行。两者都接受任何类型,而不只是字符串:数字、布尔值和对象都会通过各自的 ToString() 方法转换。

输出:

Loading.. done
42
True

Item: coffee
coffee costs 3.20
coffee costs 3.20

注意 true 输出为 True:这是 bool.ToString() 的返回值。$"..." 这种写法叫作字符串插值,是你最常用的写法;像 :F2 这样的格式代码请参见字符串插值。

用 Console.ReadLine 读取输入

Console.ReadLine() 会等待用户输入一行并按下回车键,然后把这一行作为 string 返回,不含换行符。到达输入末尾时(例如输入从一个已经读完的文件重定向而来),它返回 null。

输出:

What is your name? How old are you? 
Hi Maya, next year you will be 28.

在终端中运行这段程序时,你输入的文字会出现在每个提示后面。上面的输出中没有输入的文字,因为输入是重定向(通过管道传入)的,而不是手动输入的,所以只显示程序自己写出的内容。

ReadLine 总是返回文本。要把这个值当作数字使用,必须先转换它。当文本不是数字时,int.Parse(text) 会抛出 FormatException;int.TryParse 则返回 false,所以它才是处理用户输入的正确选择。详情请参见类型转换。

还有两个相关的方法:Console.Read() 以 int 代码返回下一个字符,Console.ReadKey() 读取单次按键,不需要等待回车(它只在交互式终端中有效)。

Main 方法的其他形式

Main 可以接收命令行参数,也可以返回退出码。下面这些都是有效的入口点:

static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main()             // C# 7.1 and later
static async Task<int> Main(string[] args)  // C# 7.1 and later

返回的 int 会成为进程的退出码,脚本和 CI 系统会读取它来判断程序是否成功(按照惯例,0 表示成功)。

输出:

Got 0 argument(s)

用 dotnet run -- apples pears 运行它,args 中就会有 "apples" 和 "pears"。-- 用来分隔传给你的程序的参数和传给 dotnet 工具的参数。

注释

C# 有三种注释。编译器会忽略所有注释。

// A single-line comment runs to the end of the line.

/* A block comment
   can span several lines. */

/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;

在代码内部写说明时用 //。/// 注释写在类型和公共成员上;当你把鼠标悬停在调用处时,IDE 会显示它们,编译器还可以把它们导出到 XML 文件中,供文档工具使用。

用 dotnet 创建和运行项目

在你自己的电脑上,从 dotnet.microsoft.com 安装 .NET SDK,然后:

dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!

dotnet new console 会创建两个文件:HelloApp.csproj(项目文件:目标框架、设置、包引用)和 Program.cs。dotnet run 编译并运行项目。dotnet build 只编译不运行,并把输出写到 bin/Debug/net8.0/(文件夹名称取决于你的目标框架)。

顶级语句(C# 9 及以上)

打开生成的 Program.cs,你会看到下面的内容,除此之外什么都没有:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

这是一个使用顶级语句的程序,这是 C# 9 的特性。编译器会在你的语句外面生成 Program 类和 Main 方法。using System; 也不见了,因为 .NET 6 及以上版本的项目启用了隐式 using:System、System.IO、System.Linq 和 System.Collections.Generic 等常用命名空间会被导入到整个项目中。

使用顶级语句的程序仍然可以读取 args、使用 await,以及 return 一个退出码:

// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;

每个项目只能有一个文件包含顶级语句,而且类型(类、record)必须写在它们之后。string? 标注是可空引用类型(C# 8),之所以写它,是因为 ReadLine 可能返回 null。本页示例中使用的显式 class Program 写法与之等价,也是你在较老的代码和大多数 Unity 脚本中会看到的写法,所以两种都要能读懂。如果你希望新项目使用显式写法,可以给 dotnet new console 加上 --use-program-main。

最先会遇到的错误

  • CS1002: ; expected. 某条语句缺少分号。错误会报告在缺少分号的那一行的末尾。
  • CS0103: The name 'console' does not exist in the current context. 大小写写错了,或者在没有启用隐式 using 的项目中缺少 using System;。
  • CS5001: Program does not contain a static 'Main' method suitable for an entry point. Main 拼写错误、不是 static,或者签名不受支持。
  • CS0017: Program has more than one entry point defined. 有两个类各自都有一个 Main。只保留一个,或者在 .csproj 中通过 StartupObject 设置选择其中一个。
  • 窗口一闪就关闭了。 双击启动控制台应用时,Main 返回后窗口就会关闭。请在终端中运行它,或者在测试时在末尾加上 Console.ReadKey();。

常见问题

C# 中如何写 Hello World?

在一个类的 static void Main() 方法中写上 Console.WriteLine("Hello, World!");,并在文件顶部加上 using System;。在 .NET 6 及以上版本中用 dotnet new console 创建的项目里,整个文件可以只有这一行,因为顶级语句会为你生成类和 Main。

C# 中的 Main 方法是什么?

Main 是入口点:程序启动时运行时调用的方法。它必须是 static,可以返回 void 或 int(退出码),还可以接收一个包含命令行参数的 string[] args 参数。一个程序必须有且只有一个入口点。

Console.Write 和 Console.WriteLine 有什么区别?

Console.WriteLine 输出文本后再输出一个换行符,所以下一次输出从新的一行开始。Console.Write 只输出文本,所以下一次输出会接在同一行。不带参数的 Console.WriteLine() 会输出一个空行。

C# 中如何读取用户输入?

Console.ReadLine() 读取一行文本,并以 string 返回(不含换行符),没有更多输入时返回 null。要得到数字,需要转换字符串:当文本不是数字时,int.TryParse(Console.ReadLine(), out int n) 会返回 false,而不会让程序崩溃。

如何从命令行运行 C# 程序?

安装 .NET SDK,然后运行 dotnet new console -o HelloApp 创建项目,cd HelloApp 进入目录,再用 dotnet run 构建并运行。dotnet build 只编译,输出放在 bin/Debug/net8.0/ 中(或你所面向的版本对应的文件夹)。

Coddy 编程语言插图

和 Coddy 一起学编程

开始