c# 7.3 ValueTuple - 在解构后检查默认值
c# 7.3 ValueTuple - check for default after destructuring
我有
(string name, int val) f(bool ok) {
if (!ok) return default;
return ('John', 5);
}
然后我在某个地方做:
var result = f(true);
if (result==default) return false;
var (name, val) = result;
... do something with name & val
我发现这令人困惑且过于冗长。我只为默认检查创建 result
- 否则我不需要它...是否有更优雅的方式来检查默认情况而不使用result
中间变量 ?
我能做到:
var (name, val) = f(true);
if ((name, val)==default) return false;
... do something with name & val
但这又很乏味,尤其是当 ValueTuple 有很多参数时...
编辑:
我现在意识到上面的代码不仅冗长而且一般模式是有问题的 - 你不能使用默认值作为错误状态的替代品,原因是对于某些 ValueTuple - 即(int,int) - 不可能将默认值与其他有效值区分开来 - 即 (0, 0) 等 ..
您可以使用以下内容。
var (name,val) = f(true);
if ((name, val) == default)
该语言没有更简洁的方式来实现您想要的
但是,另一种方法是使用 尝试 模式
private static bool TryF(bool ok, out (string name, int val) result)
{
if (!ok)
{
result = default;
return false;
}
result = ("John", 5);
return true;
}
...
if (!TryF(false, out var result))
return;
// continue
您可以 return 一个可为 null 的元组。它比 return 使用默认元组稍微优雅一些,但比 Michael Randall 的 TryXXX 答案差。
private static (string name, int val)? F(bool ok) {
if (!ok) return null;
return ("John", 5);
}
var result = F(true);
if (result == null)
return;
var (name, val) = result.Value;
我最后做了:
private (bool ok, string name, int val) F(bool ok) {
if (!ok) return (false, "", 0);
return (true, "John", 5);
}
var (ok, name, val) = F(true);
if (!ok) return;
.. continue
我有
(string name, int val) f(bool ok) {
if (!ok) return default;
return ('John', 5);
}
然后我在某个地方做:
var result = f(true);
if (result==default) return false;
var (name, val) = result;
... do something with name & val
我发现这令人困惑且过于冗长。我只为默认检查创建 result
- 否则我不需要它...是否有更优雅的方式来检查默认情况而不使用result
中间变量 ?
我能做到:
var (name, val) = f(true);
if ((name, val)==default) return false;
... do something with name & val
但这又很乏味,尤其是当 ValueTuple 有很多参数时...
编辑:
我现在意识到上面的代码不仅冗长而且一般模式是有问题的 - 你不能使用默认值作为错误状态的替代品,原因是对于某些 ValueTuple - 即(int,int) - 不可能将默认值与其他有效值区分开来 - 即 (0, 0) 等 ..
您可以使用以下内容。
var (name,val) = f(true);
if ((name, val) == default)
该语言没有更简洁的方式来实现您想要的
但是,另一种方法是使用 尝试 模式
private static bool TryF(bool ok, out (string name, int val) result)
{
if (!ok)
{
result = default;
return false;
}
result = ("John", 5);
return true;
}
...
if (!TryF(false, out var result))
return;
// continue
您可以 return 一个可为 null 的元组。它比 return 使用默认元组稍微优雅一些,但比 Michael Randall 的 TryXXX 答案差。
private static (string name, int val)? F(bool ok) {
if (!ok) return null;
return ("John", 5);
}
var result = F(true);
if (result == null)
return;
var (name, val) = result.Value;
我最后做了:
private (bool ok, string name, int val) F(bool ok) {
if (!ok) return (false, "", 0);
return (true, "John", 5);
}
var (ok, name, val) = F(true);
if (!ok) return;
.. continue