浅析C#中的Main(String[] args)参数输入问题

时间:2023-08-13 01:45:58 

指定相关的测试代码

首先,写一个用于测试的关于Main(String[] args)参数输入有关的代码类,如下:


using System;

public class Hello
{
    public static void Main(String[] args)
    {
        switch (args[0])
        {
            case "老板":
                Console.WriteLine("早上好!我们随时准备为您效劳!");
                break;
            case "雇员":
                Console.WriteLine("早上好!你可以开始工作了!");
                break;
            default:
                Console.WriteLine("早上好!祝你好运!");

                break;
        }
        Console.WriteLine("args[1]的值为:"+args[1]);
    }
}

测试运行
现在,如果直接运行,得到的结果将是一个 "索引超出了数组界限"的错误。为什么呢?因为这个时候String[] args并无任何内容,也就是说是一个空的数组,那么你引用args[0]当然会导致一个越界的错误。

浅析C#中的Main(String[] args)参数输入问题

图:直接运行导致的错误

如何在将args[0]的参数传入

现在,怎么样来将参数传入,达到我们的目的呢?可以有2种方法:

1. 在运行之前将我们的参数设定,以便传入。在"解决方案"窗口中,右键你的项目名,选择 "属性",在弹出的新窗口中选择 "调试" ->"启动选项"->"命令行参数" 中,输入你要传入的string参数值。(多个参数之间用空格隔开)

2. 将我们写好的测试代码保存,例如:Program.cs。 然后在SDK中编译(csc Program.cs) 注意路径。得到一个Program.exe的文件(同目录下),然后我们可以在SDK传入args参数了,方法是:在SDK中输入我们编译好的文件并连参数一起传入:Program.exe 老板 早上好 。得到的信息是:

早上好!我们随时准备为您效劳!
args[1]的值为:早上好

注意
1. 如果传入多个参数,一定要用空格隔开,不能使用逗号。格式是:Program.exe 参数1 参数2 ...。
2. 参数的个数要与你代码中出现的参数个数保持一致,否则会出现"索引超出数组界限"的异常。

浅析C#中的Main(String[] args)参数输入问题

图:先编译,然后将参数传入

至此就已经成功了!!!

问题:怎样在程序中设定args[]的值呢?args[]不能直接用args[0]="hello"的形式访问,也不能用args[0]=new String()的方式构造,那就只有使用传递了!

下面的程序可以直接运行能够成功,但如果去除捕捉异常的try块,还是会出现越界问题。仔细思考try块的作用可以让你对main参数传递有更深入的了解。


using System;

public class Hello
{
    static int i = 0;
    static void print()
    {
        i++;
        if (i == 1)
        {
            string[] S ={ "老板" };
            Main(S);
        }
        else
        {
            return;
        }
    }
    static void Main(string[] args)
    {
        print();
        try
        {
            switch (args[0])
            {
                case "老板":
                    Console.WriteLine("早上好!我们随时准备为您效劳!");
                    break;

                case "雇员":
                    Console.WriteLine("早上好!你可以开始工作了!");
                    break;
                default:
                    Console.WriteLine("早上好!祝你好运!");
                    break;
            }
        }
        catch
        {
            Console.WriteLine("运行完毕,finish");
            Console.ReadKey();
        }
    }
}

分析此程序

首先假设把捕捉异常try块去除. 在没有try块的情况下,执行顺序从Main()入口,调用print(),在print()中声明S(S是一个局部变量,仅在print中有效),然后调用Main(S),传入S执行Switch,对于args[0],打印出"早上好!我们随时准备为您效劳!",print()调用完成(此时S生命周期结束). 返回到Main()继续执行,到switch时,由于string属于传递引用,而此时S已经消亡,arg[0]为空,出现"索引超出了数组界限"异常的报错.

从上可以看出,实际上switch块要执行两次,前一次在一个函数调用内执行,传入args[0]的值,而第二次由于S的消亡,导致args[0]为空.出现"索引超出了数组界限"异常. 那么,加上捕捉异常try块的原因就很明显了, 那就是阻止switch块的第二次运行直接进入catch, 防止args[0]在没有值的情况下被使用.

此程序可以被扩展,注意关键字static起到的作用。反复演练此程序,不断去破坏和加固它,会感觉受益良多。

标签:Main,String,args
0
投稿

猜你喜欢

  • 基于SpringCloudGateway实现微服务网关的方式

    2021-12-02 04:33:04
  • Java把数字格式化为货币字符串实例代码

    2022-10-13 23:17:27
  • Android编程获取网络时间实例分析

    2022-08-05 16:28:01
  • SpringMVC中的handlerMappings对象用法

    2023-01-09 21:38:36
  • 一文详解如何在控制台显示MyBatis的SQL语句

    2023-01-09 06:43:38
  • C#实现汉字转拼音或转拼音首字母的方法

    2022-10-22 17:26:01
  • android studio生成aar包并在其他工程引用aar包的方法

    2021-07-23 21:28:30
  • C#实现图片上传(PC端和APP)保存及 跨域上传说明

    2022-11-10 17:05:11
  • Android编程实现滑动按钮功能详解

    2022-04-14 04:58:39
  • Android波纹扩散效果之仿支付宝咻一咻功能实现波纹扩散特效

    2023-07-06 17:22:01
  • java list随机抽取元素的案例

    2023-12-22 22:21:59
  • Spring实战之ResourceLoader接口资源加载用法示例

    2023-11-20 12:16:49
  • Java 动态代理深入理解

    2023-04-13 10:54:21
  • Java数据结构之AC自动机算法的实现

    2023-08-31 07:23:57
  • Java OOP三大特征之封装继承与多态详解

    2023-11-11 01:11:56
  • 浅析Android TextView常用属性

    2022-12-20 00:32:18
  • WCF和Remoting之间的消息传输

    2023-04-15 01:01:20
  • Android自定义TextView跑马灯效果

    2023-08-07 01:14:57
  • C语言字符串函数入门

    2021-07-22 17:10:15
  • c#常用表格控件dataGridView的分页显示

    2022-08-05 13:55:20
  • asp之家 软件编程 m.aspxhome.com