我应该测试Main的args数组中值的无效性

时间:2015-06-24 10:10:30

标签: c# null main

根据这篇文章:

is this overkill for assessing Main(string[] args)

似乎args在

中永远不会为空
static void Main(string[] args)

很高兴知道,但假设args.Length == 1为真,是否可以让args [0] == null? 首先观察:字符串数组可以包含空元素

第二个观察:如果使用命令行调用main,我将不知道如何传递null,我认为不可能,

第三个观察:另一方面(这有点牵强)一些代码可能会调用

Program.Main(new string[]{null}) 

因此,可以产生一个在args数组中获得空值的情况。

所以问题是:

在主要论证中对无效进行测试是否过度或良好做法? (特别是考虑到第三次观察中的主要调用是不太可能的情况)

例如:以下是否正确?

 static void Main(string[] args)
 {
     if(args.Length == 1)
     {
          var v = args[0].Replace("Foo", "Bar");//hope args[0] is not null

或者我应该做什么

 static void Main(string[] args)
 {
     if(args.Length == 1 && args[0] != null)
     {
         //...

注意:我将其标记为C#,但我想这也适用于其他语言

3 个答案:

答案 0 :(得分:3)

正如您的问题中所述,static void Main()private(因为private是隐含的,如果遗漏)。无论谁叫它都必须使用反射,并且必须知道他正在冰上行走。他有责任/义务传递正确的参数(在这种情况下,“正确”在任何地方都是“无null值”。如果他没有这样做,并且他收到NullReferenceException,那么错误就是他的。所以答案是“你没有义务检查null值”(我不会这样做。这有点矫枉过正)

正如您所写(并在参考答案中所写),您无法从命令行传递null,因此这将消除另一种可能性。

答案 1 :(得分:1)

  

某些代码可能会调用

     

Program.Main(new string[]{null})

程序确实可以调用Program.Main(null),因此args确实可以为空。

问题是,你为什么要这样做?你为什么要Main(null)Main(new string[]{null})

的确,为什么要明确地致电Main

要么你在代码中做了一些愚蠢的事情,在这种情况下出现问题然后意识到你做了一些愚蠢的事情是件好事,或者某人做了些什么愚蠢的事情。使用反射来访问你的代码,在这种情况下,让事情只是抛出异常并打破并希望说服然后不要那么做!*。

(在某些特殊情况下,人们可以通过反思对Main()进行深思熟虑的调用进行论证,但是传递空参数并不是很好的考虑并且是如此专业化我的说打电话的人有责任考虑这种可能性。

如果这样的愚蠢行为很可能会有人为测试做出判断,然后尽快抛出异常,但我不太可能只是为了让事情按照自己的意愿而破裂。

*"医生!医生!我这样做会很疼!" "不要那样做!"

答案 2 :(得分:0)

操作系统永远不会在args数组中传递null元素。如果您正在编写一个旨在从命令行执行的应用程序,那么您有权依赖操作系统来履行此合同。

如果有人(或您)写了一个调用者来调用您的代码,则调用者有责任履行合同或捕获并处理可能因违反合同而导致的任何异常。