在可空范例中使用 "Try..." 方法

Consuming "Try..." methods in a nullable paradigm

首先,我是 Nullable 的超级粉丝,我认为这是自 LINQ 以来影响 C# 代码流的最伟大的事情。然而,这种改造确实会导致一些奇怪的现象。我相信我们都经历过在 Nullable 存在的情况下使用 Try... 方法。它只是没有多大意义。以下方法签名是可怕的:

    bool TryFindValue(Key key, Value? value);

一个明显的问题是,一个实现可能 return 真实并且不真实 null。此外,编译器并不能很好地处理它,所以你需要使用 ! (即使你不能 实际上 保证它不是 null ) 所以你可能也应该进行空检查(这就是使这种模式不起作用的原因)。好的,那怎么办?好吧,这很明显。你这样做:

    Value? FindValue(Key key);

不错。 bool 和 value 都包含在一个类型中。但这让我经常做的其他事情有点尴尬。假设我之前有以下内容:

    if(boolValue && TryFindValue(key, out var value))
        DoSomethingWith(value);
    else
        DoSomethingElse();

假设 TryFindValue() 相对昂贵;除非 boolValue 为真,否则我不想这样做。我现在如何干净地写这个?也许是这个?

Value? value = boolValue ? FindValue(key) : null;
if(value != null)
    DoSomethingWith(value);
else
    DoSomethingElse();

这并不可怕,但它的某些方面仍然困扰着我。我觉得如果有多个条件, ?: 模式可能会变得有点不可读。有没有人对更好的模式有建议,或者这是我们现在能做的最好的?

使用 pattern 检查空值:

if(boolValue && FindValue(key) is Value value)
    DoSomethingWith(value);
else
    DoSomethingElse();