浅析C#中的Main(String[] args)参数输入问题
指定相关的测试代码
首先,写一个用于测试的关于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]当然会导致一个越界的错误。
图:直接运行导致的错误
如何在将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. 参数的个数要与你代码中出现的参数个数保持一致,否则会出现"索引超出数组界限"的异常。
图:先编译,然后将参数传入
至此就已经成功了!!!
问题:怎样在程序中设定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起到的作用。反复演练此程序,不断去破坏和加固它,会感觉受益良多。
相关文章
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
mybatis 返回Integer,Double,String等类型的数据操作
这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 本文给大家分享了C# 中string.split用法的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2020-06-25
- 很多类都重写了ToString方法, 导致很多类的tostring到底执行了什么,有哪些参数,都不清楚...2020-06-25
- string与[]byte经常需要互相转化,普通转化会发生底层数据的复制,下面这篇文章主要给大家介绍了关于Go中string与[]byte高效互转的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-09-20
- 这篇文章主要介绍了在C#的类或结构中重写ToString方法的用法简介,需要的朋友可以参考下...2020-06-25
Javascript实现Array和String互转换的方法
这篇文章主要介绍了Javascript实现Array和String互转换的方法,涉及JavaScript中toString方法与split方法的使用技巧,需要的朋友可以参考下...2015-12-24- 这篇文章主要介绍了C#中enum和string的相互转换的相关资料,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C++ 字符串string和整数int的互相转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
本文主要介绍字符串string和内存流MemoryStream及比特数组byte[]之间相互转换的方法,需要的小伙伴可以参考一下。...2020-06-25- 很多朋友不清楚如何在Byte[]和String之间进行转换?下面小编给大家带来了byte与string转换的方法,感兴趣的朋友参考下吧...2020-06-25
- 这篇文章主要给大家介绍了关于C++ string替换指定字符的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-25
Mysql中关于Incorrect string value的解决方案
在对mysql数据库中插入数据的时候,直接插入中文是没有问题的!但是用预编译语句时,用流对数据进行处理总报incorrect string value这个异常。本篇文章教给你解决方法...2021-09-20- 这篇文章主要介绍了Java中args参数数组的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-20
- String.format无论是在C#中还是在java中应用都非常广泛,今天小编抽个时间把有关string.format知识总结分享给大家,需要的朋友可以参考下...2020-06-25
- 这篇文章主要给大家介绍了关于c#中string的特性介绍及注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
C#中图片.BYTE[]和base64string的转换方法
下面小编就为大家带来一篇C#中图片.BYTE[]和base64string的转换方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25