经典的第一个程序会输出一行文本。在 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/ 中(或你所面向的版本对应的文件夹)。