在可空范例中使用 "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();
首先,我是 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();