通常,在编程中我们会遇到null
检查显示特别大的情况.我说的是:
if (doc != null) { if (doc.Element != null) { ... and so on } else throw new Exception("Element cannot be null"); } else { throw new Exception("document cannot be null"); }
基本上,整个事情变成了一个难以理解的噩梦,所以我想知道:有没有更简单的方法来描述我上面要做的事情?(除了空检查,我string.IsNullOrEmpty
不时会得到类似的东西.)
接受的答案:我接受了具有此链接的答案,因为所描述的方法具有创新性,正是我想要的.谢谢肖恩!
看看这篇文章:一种流畅的C#参数验证方法
它由一个Paint.NET开发人员编写.他使用扩展方法来简化和清理空检查代码.
将它们向前推到函数的开头,并将它们从执行工作的代码部分中取出.像这样:
if (doc == null) throw new ArgumentNullException("doc"); if (doc.Element == null) throw new ArgumentException("Element cannot be null"); AndSoOn();
如果你只是想抛出异常,为什么不让语言运行时为你抛出它?
doc.Element.whatever("foo");
您仍将获得具有完整回溯信息的NullPointerException(或C#中的任何内容).
您可能对Spec#感兴趣:
Spec#是API契约的形式语言,它使用非空类型,前置条件,后置条件,对象不变量和模型程序(将整个运行历史考虑在内的行为契约)构造扩展C# .
你可以让调用者负责确保参数不为null.Spec#使用感叹号表示:
public static void Clear(int[]! xs) // xs is now a non-null type { for (int i = 0; i < xs.Length; i++) { xs[i] = 0; } }
现在是Spec#编译器,它将检测可能的空引用:
int[] xs = null; Clear(xs); // Error: null is not a valid argument
作为旁注,您可能还想确保您没有违反得墨忒耳法则.