我正在设计一个API,有些方法在无法完成请求的操作时返回null,比如按名称搜索对象。这需要使用这些方法来检查空结果,否则就有可能暴露出错误。
如果没有检查方法的结果是否为空,是否有编译时错误/警告?例如,如果您声明一个变量然后使用它而不分配任何内容,编译器会抱怨。这些方法返回引用类型,因此Nullable不起作用,尽管它确实具有我想要的行为。
抛出异常也是一个很好的解决方案,但据我所知,C#没有办法强制捕获像Java这样的异常。
谢谢。
答案 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#。