源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-03-22 07:03 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析C#中的Main(String[] args)参数输入问题
[b]指定相关的测试代码[/b] 首先,写一个用于测试的关于Main(String[] args)参数输入有关的代码类,如下:
[u]复制代码[/u] 代码如下:
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]当然会导致一个越界的错误。 [img]http://files.jb51.net/file_images/article/201401/2014011510141214.jpg[/img] 图:直接运行导致的错误 [b]如何在将args[0]的参数传入[/b] 现在,怎么样来将参数传入,达到我们的目的呢?可以有2种方法: 1. 在运行之前将我们的参数设定,以便传入。在"解决方案"窗口中,右键你的项目名,选择 "属性",在弹出的新窗口中选择 "调试" ->"启动选项"->"命令行参数" 中,输入你要传入的string参数值。(多个参数之间用空格隔开) 2. 将我们写好的测试代码保存,例如:Program.cs。 然后在SDK中编译(csc Program.cs) 注意路径。得到一个Program.exe的文件(同目录下),然后我们可以在SDK传入args参数了,方法是:在SDK中输入我们编译好的文件并连参数一起传入:Program.exe 老板 早上好 。得到的信息是: 早上好!我们随时准备为您效劳! args[1]的值为:早上好 [b]注意[/b]: 1. 如果传入多个参数,一定要用空格隔开,不能使用逗号。格式是:Program.exe 参数1 参数2 ...。 2. 参数的个数要与你代码中出现的参数个数保持一致,否则会出现"索引超出数组界限"的异常。 [img]http://files.jb51.net/file_images/article/201401/2014011510141215.jpg[/img] 图:先编译,然后将参数传入 [b]至此就已经成功了!!![/b] 问题:怎样在程序中设定args[]的值呢?args[]不能直接用args[0]="hello"的形式访问,也不能用args[0]=new String()的方式构造,那就只有使用传递了! 下面的程序可以直接运行能够成功,但如果去除捕捉异常的try块,还是会出现越界问题。仔细思考try块的作用可以让你对main参数传递有更深入的了解。
[u]复制代码[/u] 代码如下:
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();         }     } }
[b]分析此程序[/b] 首先假设把捕捉异常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起到的作用。反复演练此程序,不断去破坏和加固它,会感觉受益良多。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部