我应该测试 Main 的 args 数组中值的空性吗?

本文关键字:数组 测试 Main args 我应该 | 更新日期: 2023-09-27 17:59:16

根据这篇文章:

这是评估 Main(字符串[] 参数(的矫枉过正吗?

似乎参数永远不会为空

static void Main(string[] args)

好吧,很高兴知道,但是,假设参数。长度 == 1 为真,是否有可能具有 args[0] == 空?第一个观察:字符串数组可以有空元素

第二个观察:如果使用命令行调用 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#,但我想这也适用于其他语言

我应该测试 Main 的 args 数组中值的空性吗?

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

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

某些代码调用可能

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

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

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

事实上,你为什么要明确地称Main

要么你在代码中做了一些愚蠢的事情,在这种情况下,出了

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

(在某些特殊情况下,人们可以提出一个经过深思熟虑的通过反思来调用Main()的论据,但是通过空参数并不是经过深思熟虑的,而且如此专业,我会说调用者有责任考虑这种可能性(。

如果这种愚蠢行为很可能,人们可以提出一个测试的理由,然后尽早抛出一个异常,但它不太可能让我倾向于让事情随心所欲地破裂。

*"医生!医生!我这样做的时候很痛! "那你别这样!">

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

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