我经常在 C# 中看到这样的方法:(进行可能会或可能不会给出结果的计算)
bool TrySomething(SomeType inputData, out SomeOtherType result) { ... }
为什么人们不使用这样的东西?
Nullable<SomeOtherType> TrySomething(SomeType inputData) { ... }
只是性能差异吗?这是一个struct
, 所以必须没有堆分配,对吧?或者我错过了什么?
Nullable
在 C# 2.0 中引入 - 就像泛型一样。在此之前有很多代码。
老实说,我不喜欢在出现问题时只返回一个Nullable
。
您通常拥有的方法是
SomeOtherType Something(SomeType inputData) { ... }
如果出现问题,这将引发异常。现在在某些情况下,您想避免异常,因此有另一种方法:您提供的方法。
bool TrySomething(SomeType inputData, out SomeOtherType result) { ... }
但是,异常是准确的,而布尔值则不是。因此,如果它给您false
,您将获得更多“它不起作用”的信息。在某些情况下,这可能就足够了。我,我喜欢将“我的集合不包含该值”错误与“我当前内存不足,无法再做任何事情”错误或其他任何错误区分开来。
现在介绍Nullable
as 返回值,它是——正如我所说的——德鲁伊知识知道接收null
并不意味着“该值为空”,而是“发生了一些错误”。这是你需要记录和解释的东西,而方法的bool
结果TryXXX
是不言自明的。
简而言之,通过使用Nullable
作为返回值,除了产生稍微更混乱的代码之外,您什么也得不到。