C# 无法理解命令行参数。
我最近开始学习c#,在阅读有关filesystemwatcher类的文章时,被命令行参数弄糊涂了 从这里开始: 我复制了c#,当我阅读代码时感到困惑,因为它说如果参数不等于2,基本上不会继续。我以为只有一个参数,目录路径?当我打印args[0]和args[1]时,它打印了watcher.exe和目录,但是我认为目录是watcher.exe的参数,而不是watcher.exe本身是参数?当我查看这个示例()时,它没有显示打印参数时打印的cmdline2,如果有人知道原因,那就太好了C# 无法理解命令行参数。,c#,visual-studio-2015,command-line-arguments,C#,Visual Studio 2015,Command Line Arguments,我最近开始学习c#,在阅读有关filesystemwatcher类的文章时,被命令行参数弄糊涂了 从这里开始: 我复制了c#,当我阅读代码时感到困惑,因为它说如果参数不等于2,基本上不会继续。我以为只有一个参数,目录路径?当我打印args[0]和args[1]时,它打印了watcher.exe和目录,但是我认为目录是watcher.exe的参数,而不是watcher.exe本身是参数?当我查看这个示例()时,它没有显示打印参数时打印的cmdline2,如果有人知道原因,那就太好了 另外,作为一个
另外,作为一个附带问题,我确实尝试编写了导致应用程序崩溃的eline args[2]。我想我会在VS 2015中测试调试器,但当我需要将参数传递给应用程序时,我找不到如何调试代码?我看到的只是一个启动按钮,没有参数选项 之所以会发生这种情况,是因为
args[]
参数数组是以一种特殊的方式构造的,这与传统无关。(我相信这是从Unix C中的main()
函数开始的传统。)每个人都熟悉它,所以每个人都认为它是正常的,但是如果您是第一次看到这一点,您感到困惑是可以理解的
以下是args[]
的格式:
args[0] = the pathname of the executable file from which the current process started.
args[1] = the first argument passed to the program.
args[2] = the second argument passed to the program.
and so on.
因此,args
的长度将始终大于或等于1,因为当前进程总是从一个可执行文件开始的
当然,这会变得很棘手,因为如果您想确保您的程序只传递了1个参数,那么必须执行if(args.Length==2)
。这就是你困惑的根源
不幸的是,人们认为这种事情是“正常”的,他们甚至懒得记录正在发生的巫术。
修正案
更糟糕的是,微软正试图用C#来“纠正”这种不幸的情况,但它们并不一致:
在“Main()和命令行参数(C#编程指南)”()中,他们说:
不像C和C++,程序的名称不被当作第一个命令行参数。
但是在System.Environment.GetCommandLineArgs()的文档中,他们说: 第一个元素是可执行文件名,以下零个或多个元素包含其余的命令行参数 (请记住,当我们说“第一个元素”时,我们指的是索引为零的元素。) 因此,索引0处的参数可能是也可能不是可执行文件;这取决于您手中的参数数组是传递给Main()
函数的参数数组,还是通过调用System.Environment.GetCommandLineArgs()
获得的参数数组
很好?我知道,请告诉我。您的第一个参数是可执行文件的路径。->c://…/watcher.exe。第二个是要监视的目录
打印args[2]时它会崩溃,因为没有第三个参数。如果您想在VS2015中添加一个,可以单击解决方案->属性->调试。您可以在这里的“命令行参数”下设置命令行参数。您还应该能够通过单击一行并添加断点进行调试。谢谢您的帮助,刚才找到的也回答了我关于第二个示例的问题。。。这是因为第一个是命令行参数,第二个不是。再次感谢。这是我第一天从sololearn搬到visual studio来练习它,我碰巧遇到了这样的事情。。。这都是有趣的游戏!