从这些核心构建基块生成 C# 程序:命名空间组织类型、类型(类、结构、接口、枚举和委托)定义行为和数据,以及语句和表达式在运行时执行工作。 构建入口点的方式取决于所选的应用程序样式。
选择应用程序样式
创建 C# 程序时,请对如何构建 C# 程序进行两个独立的选择:
-
基于文件的还是基于项目的?
- 基于文件的应用从没有项目文件的单个
.cs文件运行。 - 基于项目的应用使用
.csproj文件,并且可以跨越多个源文件。
- 基于文件的应用从没有项目文件的单个
-
顶层语句或
Main方法?- 顶级语句允许直接在文件顶部编写可执行代码。
- 方法
Main将入口点包装在显式静态方法中。
基于项目的应用和基于文件的应用都支持任一入口点样式。
基于文件的应用与基于项目的应用
从 C# 14 和 .NET 10 开始, 基于文件的应用 使你无需项目文件即可运行包含在单个 *.cs 文件中的程序。 将以下代码保存到一个名为 hello-world.cs 的文件中,然后使用 dotnet run hello-world.cs 或 dotnet hello-world.cs 运行它。
#!/usr/bin/env dotnet
Console.WriteLine("Hello, World!");
注释
该 #! 行允许 Unix shell 直接运行文件。 在任何 Unix 系统上,设置 execute (+x) 权限并从命令行运行文件。
基于文件的应用支持所有 C# 语法,并且可以使用 预处理器指令 来配置生成系统。 对小型命令行实用工具、原型和试验使用基于文件的应用。 基于文件的应用由目录中的单个文件组成:
my-app/
└── hello-world.cs
基于项目的应用使用.csproj文件和 .NET CLI 命令dotnet newdotnet build和dotnet run工作流。 当你的程序跨越多个文件或需要精细的生成配置时,请选择基于项目的应用。 基于项目的应用包括项目文件以及一个或多个源文件:
my-app/
├── my-app.csproj
├── Program.cs
├── Models/
│ └── Person.cs
└── Services/
└── GreetingService.cs
如果基于文件的应用增长,可以轻松将其转换为基于项目的应用。 运行 dotnet project convert 以从现有源文件生成项目文件。
如果你知道你的应用从一开始就需要多个源文件,请从基于项目的应用开始。 避免转换步骤,并可以立即将代码组织到单独的文件中。
顶级语句与 Main 方法
通过使用 顶级语句,可以直接在一个文件中编写可执行代码,而无需将其包装在类和 Main 方法中。 在使用dotnet new console创建新的控制台应用程序时,此样式为默认值。 以下示例演示使用 顶级语句的新式 C# 程序:
Console.WriteLine("Hello, World!");
namespace YourNamespace
{
class YourClass
{
}
struct YourStruct
{
}
interface IYourInterface
{
}
delegate int YourDelegate();
enum YourEnum
{
}
}
项目中只有一个文件可以有顶级语句,入口点是该文件中的第一行程序文本。 生成较大的程序时,将包含更多程序元素。
还可以将显式静态 Main 方法定义为程序的入口点:
// A skeleton of a C# program using an explicit Main method
namespace YourNamespace;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
两种入口点样式都适用于基于文件的和基于项目的应用。 这两种样式都支持相同的功能。
生成和运行 C# 程序
C# 是 一种已编译 的语言。 对于基于项目的应用,使用 dotnet build 命令将源文件编译为二进制包。 使用dotnet run一步生成并运行。
dotnet.NET SDK 中包含的 CLI 提供了许多用于创建、生成和管理 C# 项目的工具。
对于基于文件的应用, dotnet run hello-world.cs 直接编译并运行单个文件 - 无需项目文件。
表达式和语句
如果遵循 入门 教程,则已编写表达式和语句。 你键入的每一行代码都是一行或另一行(或两者)。 现在,让我们定义这些术语。
表达式和语句是 C# 程序的基本构建基块。 表达式生成值。 语句执行操作,通常以分号结尾。
以下是表达式:
-
42(文本值) -
x + y(算术运算) -
Math.Max(a, b)(生成值的方法调用) -
condition ? trueValue : falseValue(条件表达式) -
new Person("John")(对象创建)
语句执行操作。 语句控制程序流、声明变量或调用操作。 以下是声明:
-
int x;(申报单) -
int x = 42;(初始化声明语句) -
Console.WriteLine("Hello");(方法调用语句) -
if (condition) { /* code */ }(条件语句) -
return result;(return 语句)
语句通常包含表达式,表达式可以嵌套在其他表达式内。 例如,以下声明语句将加法表达式的结果赋给 f。 该加法表达式添加两个方法调用表达式的结果:
var maxResult = Math.Max(a, b) + Math.Max(c, d);
有关语句的详细信息,请参阅 语句。 有关表达式主体成员的信息,请参阅 表达式主体成员。