浅析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起到的作用。反复演练此程序,不断去破坏和加固它,会感觉受益良多。

(0)

相关推荐

  • C#实现去除Strings中空格的方法

    本文实例讲述了C#实现去除Strings中空格的方法,分享给大家供大家参考.具体实现方法如下: 一般来说,你或许知道你能使用String.Trim方法去除字符串的头和尾的空格,不幸运的是. 这个Trim方法不能去除字符串中间的C#空格. 示例代码如下: 复制代码 代码如下: string text = "  My test\nstring\r\n is\t quite long  ";  string trim = text.Trim(); 这个'trim' 字符串将会是: 复制代码

  • C#中string.format用法详解

    本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项. String.Format (IFormatProvide

  • C#中String与string的区别分析

    本文实例展示了C#程序设计中String与string的区别,对于C#初学者来说有很好的参考借鉴价值.具体如下: 一.区别分析: String:类,System.String string:类型,变量 两者本质上没有任何区别,都是System.String,string只是System.String的别名而已 唯一的区别在于如何按照代码约定的来写,如声明变量时使用小写string,使用System.String下方法时使用大写的String 二.示例代码如下: class Program { s

  • C# String Replace高效的实例方法

    复制代码 代码如下: [ThreadStatic]        static char[] mTempChars; protected static char[] GetTempData()        {            if (mTempChars == null)                mTempChars = new char[1024 * 64];            return mTempChars;        } public static string

  • C#中string和StingBuilder内存中的区别实例分析

    本文实例分析了C#中string和StingBuilder内存中的区别,有助于更好的掌握C#程序设计中string和StingBuilder的用法.分享给大家供大家参考.具体方法如下: 关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. 先来看看下面这段代码: //示例: string 的内存模型 namespace ConsoleApplication2 { class Program { static void Main(

  • javascript模拟实现C# String.format函数功能代码

    C# string.format这个功能用到的地方比较多, 所以就用js实现了一个简单的版本 : 复制代码 代码如下: String.format = function ()        {            var formatStr = arguments[0]; if ( typeof formatStr === 'string' )            {                var pattern,                    length = argume

  • C#自定义函数NetxtString生成随机字符串

    本文实例展示了C#自定义函数NetxtString实现生成随机字符串的方法,在进行C#项目开发中非常实用!分享给大家供大家参考. 一.生成随机字符串 关键代码如下: /// <summary> /// 生成随机字符串 /// </summary> /// <param name="random">Random</param> /// <param name="size">字符串长度</param>

  • C#中StringBuilder类的使用总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类.例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能. 通过用一个重载的构造函数方法初始化变量,可以创建

  • C#中把字符串String转换为整型Int的小例子

    本文介绍如何在使用C#开发程序时,将一个字符串String变量的值转换为一个整型Int变量. 比如,我们在C#中定义一个字符串变量,用它来获取一个xml中的值.小编这里并不是故意要用一个字符串去获取xml节点的值,而是使用InnerText的方式获取的值必须是字符串String类型的. 复制代码 代码如下: string tmpValue = ""; tmpValue = xml.DocumentElement["expirydays"].InnerText.Tri

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

    指定相关的测试代码 首先,写一个用于测试的关于Main(String[] args)参数输入有关的代码类,如下: 复制代码 代码如下: using System; public class Hello{    public static void Main(String[] args)    {        switch (args[0])        {            case "老板":                Console.WriteLine("早上

  • C#中static void Main(string[] args) 参数示例详解

    学习C#编程最常见的示例程序是在控制台应用程序中输出Hello World! using System; namespace DemoMainArgs { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.ReadLine(); } } } static:是将Main方法声明为静态, 是应用程序的入口. void:说明main方法不会返回任何内容. s

  • 实例分析Java中public static void main(String args[])是什么意思

    本文实例讲述了Java中public static void main(String args[])的来龙去脉.分享给大家供大家参考,具体如下: public static void main(String[] args) 这绝对不是凭空想出来的,也不是没有道理的死规定,而是java程序执行的需要. jvm在试图运行一个类之前,先检查该类是否包含一个特殊方法.这个方法必须是公有的,以便在任何位置都能访问得到.这个方法必须是static的,因为这个方法不能依赖任何该类的实例即可运行,而非stati

  • Java 图文并茂讲解主方法中的String[] args参数作用

    目录 一.作用 二.在控制台传入参数 三.在IntelliJ IDEA中传入参数 总结 一.作用 主方法就是程序的入口,那么里面的String[] args参数是什么意思呢? String[]表示的是字符串类型的数组,args表示的是传入的参数名,所以整体的意思就是主方法main(String[] args)可以接收一个字符串类型的数组,数组名字为args.(相当于入参) args这个数组是留给用户的,用户可以在外部输入参数,这个参数会被自动转换为"Sting[] args"传入主方法

  • Java main方法String[]args原理实例解析

    一个程序中必定会有一个入口,java中main方法就是一个项目的的入口, public static void main(String[] args) {} eclipse的生成快捷键main+回车 ,idea的生成快捷键:psvm+回车 args数组是main方法自带的,我也不知道干什么的最近刷题遇到了三个有关的这个的题目看着我迷迷糊糊的记录一下 第一题: 第二题: 第三题 三个题都涉及了这个String[]args数组 下面以第二题为例简单说: 下面有一段代码,简单看看跟题目一样: publ

  • 浅析java中String类型中“==”与“equal”的区别

    一.前言 1.1.首先很多人都知道,String中用"=="比较的是地址,用equals比较的是内容,很多人对此用的是记忆法,通过记忆来加强此的引用,但是其真正的原理其实并不难,当我们真正明白其为什么的时候,用起来也会更加灵活,更加有底气(形容得不太好,朋友别见怪): 二相关知识的准备 类型常量池 运行时常量池 字符串常量池 我们今天讨论的主题是当然是字符串常量池: 为什么在这要把另外两个常量池拿出说一下呢,首先小生我在网上或者cnds上看到很多人在争论字符串常量池是存在与方法区还是堆

  • Java中args参数数组的用法说明

    main方法args参数用于接收用户输入的参数,参数以字符串形式存放在数组中. 这里将传递参数参数的形式分两种,一种是传递普通参数,另一种是传递含有空格的参数. 1.传递普通参数 public class Test { public static void main(String[] args) { for(String s : args){ System.out.println(s); } } } main方法接收参数以空格作为参数的分隔符号,第一个参数为"Hello",第二个参数是

  • 浅析Java中String与StringBuffer拼接的区别

    学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: StringBuffer能够拼接所有的类型的值. public class Test { public static void main(String[] args) { String str1="abc"; String str2="cba"; //使用Stirng的c

  • 浅析C#中StringBuilder类的高效及与String的对比

    在C#中,在处理字符串拼接的时候,使用StringBuilder的效率会比硬拼接字符串高很多.到底有多高,如下: static void Main( string[] args ) { string str1 = string.Empty; Stopwatch sw1 = new Stopwatch(); sw1.Start(); for ( int i = 0; i < 10000; i++ ) { str1 = str1 + i.ToString(); } sw1.Stop(); Conso

  • 浅析JAVA中的内存结构、重载、this与继承

    一.对象在JVM的内存结构 JAVA内存管理由JVM来管理. 1)堆,所有new出来的对象(包括成员变量) 2)栈,所有局部变量(包括方法的参数) 3)方法区,class字节码文件(包括方法,静态数据) 1.引用变量指向null时,会发生空指针异常 public class student { int age; String name; public student(int age,String name){ this.age=age; this.name=name; } public stat

随机推荐