C# Main函数详解

2018-01-15 22:10:59


 一、Main()方法的简介

1、唯一性。一般情况下,一个C#可执行程序只有一个Main函数,作为程序入口。但是在某些情况(如单元测试中),程序拥有多个Main函数,,这个时候我们就需要通过命令行指定以哪个Main()方法作为程序的唯一入口。

2、静态性。Main()方法通过static修饰,这个主要是让我们可以通过类名加方法的形式调用Main()方法,使得我们不需要创建对象的实例(即new出该对象)而直接调用Main函数。使用静态static修饰符的原因:

3、Main的参数。分析Main()方法的参数是一个字符串(string[] args),这个参数可以包含任意数量的命令行输入参数。

4、Main函数的修饰符。一般不加修饰符,默认为private,但可以public修饰符,但编译器在编译时会设置为priavte。

二、Main()方法为什么使用static修饰

       假设没有static关键字,那意味着需要用生成一个实例后才可以调用这个Main方法,而Main方法是程序入口点,你没有进入Main方法,自然无法生成一个实例,既然没有实例,那就无法调用Main函数,岂不矛盾?所以Main函数被设置为static。直接通过类名加方法的形式调用Main()方法,使得我们不需要创建对象的实例(即new出该对象)而直接调用Main函数。

三、Main()方法的四种形式

1、无返回值,以字符串数组作为参数

1 class Program
2     {
3         static void Main(string[] args)
4         {
5         }
6    }

2、无返回值,无参数

1   class Program
2     {
3         static void Main()
4         {
5         }
6     }

3、返回int类型数值,以字符串数组作为参数

1  class Program
2     {
3         static int Main()
4         {
5 
6            return 0;//返回整数0(0:表示没有出现异常情况正常返回;其他值(非0),表示主函数执行过程中的异常情况。)
7         }
8     }

4、返回int类型数值,无参数

1   class Program
2     {
3         static int Main(string[] args)
4         {
5             return 0;//返回整数0(0:表示没有出现异常情况正常返回;其他值(非0),表示主函数执行过程中的异常情况。)
6         }
7     }

四、Main()的参数string[] args的含义

     args是用来处理命令行参数的。命令行参数,就是你运行这个程序的时候给它传的参数。它是可选项,不是必须的。具体使用如下:

1:编写如下程序

 1  class Program
 2     {
 3         static void  Main(string[] args)
 4         {
 5             foreach (string str in args)
 6             {
 7                 Console.WriteLine("Main函数传递的参数args:{0}", str);
 8             }
 9             Console.ReadKey();
10         }
11     }

2:编译完成该程序后,在Debug文件中找到该.exe文件,复制到桌面,再复制路径+文件名,然后在命令行模式下输入“C:Usersdwa1124DesktopTest aa bb cc”。运行后我们发现:

C# Main函数详解

3:使用程序启动另一个程序,并传递参数示例如下:

 1 /// <summary>
 2 /// 被启动程序
 3 /// </summary>
 4 namespace ConsoleApp1
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Console.WriteLine($"args 的入参个数:{args?.Length}");
11             if (args?.Length > 0)
12             {
13                 Console.WriteLine($"args 的全部参数为:{string.Join("," ,args)}");
14             }
15 
16             Console.ReadKey();
17         }
18     }
19 }
 1 /// <summary>
 2 /// 使用本程序启动 ConsoleApp1.exe程序
 3 /// </summary>
 4 namespace ConsoleApp2
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             try
11             {
12                 ProcessStartInfo startInfo = new ProcessStartInfo()
13                 {
14                     // 将要启动的测试程序路径
15                     FileName = $"{AppDomain.CurrentDomain.BaseDirectory}ConsoleApp1.exe",
16                 };
17 
18                 // 启动时输入的入参(入参的个数是以空格来风格的,如果该入参本身包含空格,则入参需用 "" 包括起来)
19                 string arg1 = @"C:Program Files (x86)";
20                 string arg2 = @"C:Users97460source
eposConsoleApp5ConsoleApp5inDebug
etcoreapp3.1";
21                 startInfo.Arguments = """+arg1+""";
22                 startInfo.Arguments += " ";
23                 startInfo.Arguments += """ + arg2 + """;
24 
25                 // 启动测试程序
26                 new Process() {StartInfo = startInfo}.Start();
27 
28             }
29             catch (Exception e)
30             {
31                 Console.WriteLine(e.StackTrace);
32             }
33             finally
34             {
35                 Console.ReadKey();
36             }
37         }
38     }
39 }

       需要注意:当给被启动程序传递参数时,可以传递多个参数,参数之间使用空格隔开,但当参数本身包含空格时,会把同一个参数当作两个参数去解析。因此,最好把每个参数使用使用引号括起来。下图图1是对args参数未加双引号时被启动参数解析到4个参数,加上双引号后,才正确解析为两个参数:

 C# Main函数详解 C# Main函数详解