是评估Main(string [] args)的过度杀伤力

why*_*heq 8 c# program-entry-point args

我有以下内容,并想知道初始测试是否过度杀伤:

static void Main(string[] args) {
    if (args.Length == 0 || args == null) {           
        //do X
    }
    else { 
        //do Y 
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我问的是args.Length是零的可能性,还是args为null ....或者只是其中一个条件就足够了?

jal*_*alf 15

好吧,Main定义为永远不会用null参数调用.如果它确实以某种方式接收到一个空参数,那么你的环境就会被破坏,无论你做什么,所有的赌注都会被取消,所以通过检查确实没有任何好处null.

在另一方面,如果你检查空,那么阅读器和代码的维护必须明白为什么.为什么原来的程序员会进行这样一个无用的检查?他知道我们不知道的事吗?我们不能只删除它,因为他可能已经发现了一些奇怪的角落案例错误!

换句话说,您正在为程序增加复杂性,并扼杀未来的代码读者.不要那样做.未来的用户可能就是.让自己的未来变得快乐,并编写有意义的代码.

但是,在这种空检查确实有意义的情况下,它必须是最左边的条件.

在这样的试验:args.Length == 0 || args == null,args.Length评价第一,如果失败,args进行比较null.换句话说,如果args为null,则代码将抛出异常.它应该是args == null || args.Length == 0

  • 我从来没有说过表演.但是请告诉我,如果依赖你的编程语言及其类库*来做它所说的*是多么糟糕?如果你不能依赖它,你怎么能写**任何**类代码?如果您不能相信,那么您编写的每一行,包括您的空检查**都是可疑且不可靠的.如果你想谈论可怕的做法,那么这种毫无意义的混淆就是它.说"如果全世界的*一切*都是腐败和不可靠的话?我们会做什么呢?我知道,检查`arg == null`会解决它".不,它不会. (4认同)
  • @adelphus:"这个问题很容易被问到任何其他语言." 真的吗?所以防御性编程是关于防止你的代码突然变成另一种语言*的案例*?我可以想象它."哦,狗屎,我过去8个月一直在写的C++代码原来只是Prolog!该死的,如果我能防止`main`被无效参数调用".这个问题是关于*one*特定语言的`Main`方法.在这种语言中,Main在应用程序启动时由运行时调用一次,除非程序员是疯了 (4认同)
  • 如果你的世界被打破了,那你无法解决它,你也可以不去尝试.你可以称之为"希望"编程,如果它让你感觉更好,但这是我们唯一能做的事情.我们必须*希望*编译器生成我们要求的代码.我们不得不希望`List <T>`类实际存储一个T的列表,我们必须*希望*将在启动时调用`Main`.我们必须*希望*访问`nul​​l`对象会抛出`NullReferenceException`.防御性编程无法保护您免受破坏的语言实现. (3认同)
  • 如果我骑自行车,为什么我需要戴摩托车头盔 - 如果将来有一天_自行车发芽引擎.当然,戴上自行车帽就足够了,就像jalf所说,如果有人在未来使用自行车头盔获得自行车,他们会想知道发生了什么!(也许不是我想到的最好的比喻) (3认同)
  • @adelphus:然后你可能要求任何骑手穿着10英尺厚的防护服和降落伞,并携带核导弹以防小行星坠落.面对它,你不能 - 而且不应该! - 防止可能发生的每一件奇怪事情.考虑(回到主题:))如果某事件调用"Main(null)",那么事情就会被彻底打破.那个东西将是*调用者*,而这就是修复应该去的地方.`if(args == null)`是断腿上的创可贴. (2认同)
  • 如果程序员疯了,空检查对我们没有帮助. (2认同)
  • @adelphus:我知道防守编程是什么.但是OP在一个非常具体的场景中询问了一个关于检查null*的*具体*问题.我绝对同意你的观点,在很多*其他*情况下,检查null是有意义的.但我们不是在谈论这些案件.我们讨论的是一个C#程序,其中Main方法检查其参数是否为null.SO是一个学习论坛,每个程序员应该学习的重要课程之一是"它取决于".盲目地检查**对**的所有**与检查*没有*一样愚蠢. (2认同)

App*_*ker 10

根据这个,你只需要检查:

if (args.Length == 0)
{
    // Do X
}
Run Code Online (Sandbox Code Playgroud)

虽然检查null没有造成任何伤害,但没有实际需要.

  • 为Occam的Razor +1并提供链接.当然,对于一般情况,其他答案是正确的,但这个问题非常具体. (2认同)