概述-C#程序的通用结构
C#程序由一个或多个文件组成。
每个文件均包含零个或多个命名空间。
一个命名空间包含类、结构、接口、枚举、委托等类型或其他命名空间。
以下示例是包含所有这些元素的C#程序主干。
// A skeleton of a C# program
using System;
// Your program starts here:
Console.WriteLine("Hello world!");
namespace YourNamespace
{
class YourClass
{
}
struct YourStruct
{
}
interface IYourInterface
{
}
delegate int YourDelegate();
enum YourEnum
{
}
namespace YourNestedNamespace
{
struct YourStruct
{
}
}
}
前面的示例使用顶级语句作为程序的入口点。
C#9中添加了此功能。
在C#9之前,入口点是名为Main的静态方法,如以下示例所示:
// A skeleton of a C# program
using System;
namespace YourNamespace
{
class YourClass
{
}
struct YourStruct
{
}
interface IYourInterface
{
}
delegate int YourDelegate();
enum YourEnum
{
}
namespace YourNestedNamespace
{
struct YourStruct
{
}
}
class Program
{
static void Main(string[] args)
{
//Your program starts here...
Console.WriteLine("Hello world!");
}
}
}
Main方法-Main()和命令行参数
Main方法是C#应用程序的入口点。
(库和服务不要求使用Main方法作为入口点)。
Main方法时应用程序启动后调用的第一个方法。
C#程序中只能有一个入口点。
如果多个类包含Main方法,必须使用StartupObject编译器选项来编译程序,以指定将哪个Main方法用作入口点。
有关详细信息,请参阅StartupObject(C#编译器选项)。
class TestClass
{
static void Main(string[] args)
{
// Display the number of command line arguments.
Console.WriteLine(args.Length);
}
}
自 C#9 起,可以省略Main方法,并像在Main方法中一样编写C#语句,如下面的示例所示:
using System.Text;
StringBuilder builder = new();
builder.AppendLine("Hello");
builder.AppendLine("World!");
Console.WriteLine(builder.ToString());
若要了解如何使用隐式入口点方法编写应用程序代码,请参阅顶级语句。
概述
Main方法是可执行程序的入口点,也是程序控制开始和结束的位置。
Main在类或结构中声明。Main必须是static,它不需要是public。
(在前面的示例中,它获得的是private成员的默认访问权限)。
封闭类或结构不一定要是静态的。
Main的返回类型可以是void、int、Task或Task<int>。
当且仅当Main返回Task或Task<int>时,Main的声明可包括async修饰符。
这明确排除了async void Main方法。
使用或不使用包含命令行自变量的string[ ]参数声明Main方法都行。
使用 Visual Studio 创建 Windows应用程序时,可以手动添加此形参,也可以使用 GetCommandLineArgs() 方法来获取命令行实参。
参数被读取为从零开始编制索引的命令行自变量。
与C和C++不同,程序的名称不被视为 args 数组中的第一个命令行实参,但它是
GetCommandLineArgs()方法中的第一个元素。
以下列表显示了有效的Main签名;
public static void Main() { }
public static int Main() { }
public static void Main(string[] args) { }
public static int Main(string[] args) { }
public static async Task Main() { }
public static async Task<int> Main() { }
public static async Task Main(string[] args) { }
public static async Task<int> Main(string[] args) { }
上述示例均使用public访问器修饰符。这是典型操作,但不是必需的。
添加async、Task和Task<int>返回类型可简化控制台应用程序需要启动时的程序代码,以及Main中的await异步操作。
Main()返回值
可以通过以下方式之一定义方法,以从Main方法返回 int:
Main 方法代码 | Main 签名 |
---|---|
不使用 args 或 await | static int Main() |
使用 args ,不使用 await | static int Main(string[] args) |
不使用 args ,使用 await | static async Task<int> Main() |
使用 args 和 await | static async Task<int> Main(string[] args) |
如果不使用Main的返回值,则返回void或Task可使代码变得略微简单。
Main 方法代码 | Main 签名 |
---|---|
不使用 args 或 await | static void Main() |
使用 args ,不使用 await | static void Main(string[] args) |
不使用 args ,使用 await | static async Task Main() |
使用 args 和 await | static async Task Main(string[] args) |
但是,返回int或Task<int>可使程序将状态信息传递给调用可执行文件的其他程序或脚本。
下面的示例演示了如何访问进程的退出代码。
此示例使用.NET Core命令行工具。如果不熟悉.NET Core命令行工具,可通过本本入门文章进行了解。
通过运行dotnet new console 创建新的应用程序。修改Program.cs中的Main方法,如下所示:
// Save this program as MainReturnValTest.cs.
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}
在Windows中执行程序时,从Main函数返回的任何值都存储在环境变量中。
可使用批处理文件中的 ERRORLEVEL 或 PowerShell 中的 $LastExitCode来检索此环境变量。
可使用