关于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#的Main(String[] args)参数输入问题的更多相关文章

  1. [C#]Main(String[] args)参数输入问题

    Main函数是程序的入口点,它是入口点,那它的参数,又是怎样来的呢?首先写个简单的测试程序看看args到底是什么? class Program { static void Main(string[] ...

  2. 关于Console的Main(String[] args)参数输入

    之前接触一个往Console里输入参数的项目,资深QA教我怎么run,灰常脸红. 今日无事,baidu之. Step1 写简单Console Code. class Program { static ...

  3. C#的Main(String[] args)参数输入问题

    1.新建一个控制台应用程序,保存在桌面上,Main函数如下所示 using System;using System.Collections.Generic;using System.Linq;usin ...

  4. C#中static void Main(string[] args) 参数详解

    学习C#编程最常见的示例程序是在控制台应用程序中输出Hello World! using System; namespace DemoMainArgs { class Program { static ...

  5. C#控制台程序入口函数 Main(string[] args) 参数详解

    学习C#编程最常见的示例程序是在控制台应用程序中输出Hello World! using System; namespace DemoMainArgs { class Program { static ...

  6. 【C#基础知识】C#控制台程序入口函数 Main(string[] args) 参数详解

    测试环境vs2019+.net5.0 请看 :https://cloud.tencent.com/developer/article/1507934 本测试环境vs2022+.net6.0 +wind ...

  7. [C#学习笔记3]关于Main(string[ ] args)中args命令行参数

    Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...

  8. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  9. public static void main(String[] args){}函数诠释

    public static void main(String[] args){}函数诠释 主函数的一般写法如下: public static void main(String[] args){-} 下 ...

随机推荐

  1. .gitignore文件的配置和生效

    1.配置 a)确保.gitignore文件和.git文件夹在同级目录 b)配置语法 # # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a ...

  2. sqlhelp3

    using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...

  3. ASO的效果应该如何去评判,有什么标准可以量化指标

    ASO的效果应该如何去评判,有什么标准可以量化指标 以往我们主要会教大家怎么做 ASO 优化,优化中有什么技巧……在掌握ASO优化技巧之后,从执行层面来考虑,就该选择流量平台了. 目前市场上的流量平台 ...

  4. jeecg中excel导出字段判空处理

    我们清楚,jeecg 导出 excel 采用的是 easypoi,不知道是否遇到过这种情况: 我们以一个实体属性为例: @Excel(name="问题分类",dicCode=&qu ...

  5. 使用Ajax错误的全页面刷新问题

    给提交按钮写了ajax请求,结果每次提交就将全业务刷新了.一大番折腾才知道是 提交按钮标签使用不当导致.   button 标签请添加 type='button' 属性,因为浏览器默认会认为 butt ...

  6. 60.Vue:将px转化为rem,适配移动端

    1.下载lib-flexible 我使用的是vue-cli+webpack,所以是通过npm来安装的 npm i lib-flexible --save 2.引入lib-flexible 在main. ...

  7. js中的this指向问题(小计)

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定,this最终指向调用它的对象. 1.函数调用模式 当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的.在此种模式下,t ...

  8. Kinetis Design Studio 下使用J-Link下载程序

    1.安装J-Link驱动. 在KDS安装目录下已自带J-Link驱动,进入以下目录(以我的为例): C:\Freescale\KDS_1.1.1\segger\USBDriver 将看到CDC.x64 ...

  9. python小程序--Two

    一.程序需求 1.启动程序后,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4.可随时退出,退出时,打印已购买商品和 ...

  10. 打包工具webpack安装·Mac

    最近在学Vue.js,是我接触的第一个前端框架.本来感觉还不错,各种惊叹于它可以用很少的代码写出那种具备交互能力的神奇模块. 在学的过程中总是能碰到一个叫webpack的单词,查过,是一个模块打包器, ...