zoukankan      html  css  js  c++  java
  • 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”。运行后我们发现:

    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个参数,加上双引号后,才正确解析为两个参数:

      

  • 相关阅读:
    基于SUSE Linux做NFS文件挂载
    Java实现蓝桥杯调和级数
    Java实现蓝桥杯调和级数
    Java实现分割矩形
    Java实现分割矩形
    Java实现分割矩形
    Java实现分割矩形
    Java实现分割矩形
    Java实现九阶数独
    Java实现九阶数独
  • 原文地址:https://www.cnblogs.com/dongweian/p/8290386.html
Copyright © 2011-2022 走看看