我有以下内容,并想知道初始测试是否过于严格:
static void Main(string[] args) {
if (args.Length == 0 || args == null) {
//do X
}
else {
//do Y
}
}
换句话说,我的问题是args.Length是否可能为零,或者args是否为空...或者这些条件中只需要一个就足够了吗?
我有以下内容,并想知道初始测试是否过于严格:
static void Main(string[] args) {
if (args.Length == 0 || args == null) {
//do X
}
else {
//do Y
}
}
好的,Main
被定义为永远不会使用null
参数调用。如果它以某种方式收到了null参数,则表示您的环境已经损坏,无论您做什么,所有赌注都已关闭,因此检查null
实际上没有任何帮助。
另一方面,如果您确实检查null
,那么代码的读者和维护者就必须理解为什么。最初的程序员为什么要放置这样一个无用的检查?他知道我们不知道的东西吗?我们不能仅仅删除它,因为他可能揭示了一些奇怪的角落案例漏洞!
换句话说,您正在给程序添加复杂性,并使未来的代码读者犯错误。不要这样做。未来的用户可能是您自己。让您未来的自己感到高兴,并编写有意义的代码。
然而,在某些情况下,这样的空检查确实有意义,那么它必须是最左边的条件。
在像这样的测试中:args.Length == 0 || args == null
,首先评估args.Length
,如果失败,则将args
与null
进行比较。换句话说,如果args
为空,则您的代码将抛出异常。应该是args == null || args.Length == 0
。
arg == null
就能解决问题。” 不,它解决不了。 - jalfList<T>
类实际上存储T类型的列表,我们必须希望在启动时调用Main
方法。我们必须希望访问null
对象会引发NullReferenceException
异常。防御性编程无法保护你免受损坏的语言实现的影响。 - jalfmain
被传入无效参数就好了。” 这个问题涉及到一个特定语言中的 Main
方法。在这种语言中,Main 只会在应用程序启动时由运行时调用一次,除非程序员疯了。 - jalf如果涉及到性能不高、不常用的函数,增加额外的控制永远不是坏主意。所以我会说,不,这并不过度。
还有一件事:首先检查null
,然后检查Length
。
Main
函数不会使用空参数调用,所以不要试图在代码中测试"如果它确实这样做会怎么样",从而增加代码的复杂性。 - jalfargs
永远不会是 null(除非有人在应用程序内部明确调用并传递了 null
)。这不是一个库函数;它是 CLR 规范的一部分。这不仅仅是因为它「不应该」发生;除非你从应用程序内部(错误地!)调用 Main
,否则它不会发生...或者出现了无法信任运行时的严重问题。如果你甚至不能信任运行时正确启动你的应用程序,那么从那一点开始你如何能够信任任何东西呢? - cHaoif (args == null)
{
Console.WriteLine("args is null"); // Check for null array
}
else
{
if (args.Length == 0)
{
//do X
}
else
{
//do Y
}
}
if (args == null) { ... } else if (args.Length == 0) { ... } else { ... }
来简化代码,省去一层花括号。顺便说一下,在大多数情况下,处理 null
和空数组的分支可能是相同的。 - Joeynull
,然后再检查Length
:if (args == null || args.Length == 0) ...
- Joey
args
是null
,会发生什么?检查args.Length
将抛出NullReferenceException
异常。 - Greg Bargs
确实为null,那么你的第一个条件会抛出一个NullReferenceException
。 - Ioannis Karadimas