【问题标题】:Should I test for nullity of values in the args array of Main我是否应该测试 Main 的 args 数组中的值是否为空
【发布时间】:2015-09-10 11:47:40
【问题描述】:

根据这篇文章:

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 数组中获取空​​值的情况。

所以问题是:

在 main 的论点中进行无效测试是矫枉过正还是好的做法? (特别是考虑到在第三个观察中调用 like 的主要情况不太可能)

例如:以下是否正确?

 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#,但我想这也适用于其他语言

【问题讨论】:

    标签: c# null main


    【解决方案1】:

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

    正如您所写(以及在引用的答案中所写),您不能从命令行传递 null,因此这消除了另一种可能性。

    【讨论】:

      【解决方案2】:

      可能有一些代码调用

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

      一个程序确实可以调用Program.Main(null),所以args确实可以为null。

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

      确实,您为什么要明确调用Main

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

      (在某些特殊情况下,可以通过反射为经过深思熟虑的Main() 调用提出论据,但随后传入空参数并没有经过深思熟虑,而且如此专业,我想说责任在于来电者考虑这种可能性)。

      如果这种愚蠢行为很可能发生,人们可以为测试提供理由,然后尽早抛出异常,但我不太可能倾向于任由事情发生。

      *“医生!医生!我这样做的时候好痛!” “那就不要那样做!”

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2015-09-03
        • 2010-11-06
        相关资源
        最近更新 更多