C#:使用编译器强制检查null

时间:2009-10-22 15:44:37

标签: c#

我正在设计一个API,有些方法在无法完成请求的操作时返回null,比如按名称搜索对象。这需要使用这些方法来检查空结果,否则就有可能暴露出错误。

如果没有检查方法的结果是否为空,是否有编译时错误/警告?例如,如果您声明一个变量然后使用它而不分配任何内容,编译器会抱怨。这些方法返回引用类型,因此Nullable不起作用,尽管它确实具有我想要的行为。

抛出异常也是一个很好的解决方案,但据我所知,C#没有办法强制捕获像Java这样的异常。

谢谢。

4 个答案:

答案 0 :(得分:7)

IMO,这些方法应该抛出异常。

很多这样的事情(理论上)可以在4.0中使用代码契约进行改进,因为当方法声称返回null(或不是)并且需要非时,这会使它更正式一些 - 无(或不)。

但不是;没有内置的检查;编译器强制确定明确分配,但不分配 。在C#3.0中,您可能会做一些厚颜无耻的事情:

public static T ThrowIfNull<T>(this T obj) where T : class {
    if(obj == null) throw new SomeException("message");
    return obj;
}

然后您可以将其用作流畅的API:

SomeReturnClass myObj = foo.SomeMethod().ThrowIfNull();

然后myObj永远不会为空...

答案 1 :(得分:4)

你需要第三方插件才能做到这一点。 Resharper可以警告您引用空值。

答案 2 :(得分:3)

您要求的功能是Spec#的一部分。此扩展添加了前置条件,后置条件和对象不变检查。

答案 3 :(得分:1)

从其他答案来看,目前还不可能。添加到StyleCop的自定义规则是否可以提供类似的目的?

有关示例,请参阅Creating Custom StyleCop Rules in C#