我一直在研究从方法返回元组,所以方法签名像这样......:
private int GetAlpha() {...} // -1 indicates an error
private bool GetAlpha(out int alphaOut) {...}
...变成这样:
private (bool Success, int Alpha) GetAlpha() {...}
优点:
- 我喜欢避免使用带外值(例如
-1
)来向调用者发出错误信号 - 我最近读到,
out
参数是邪恶的,应该避免
缺点:
- 在典型方法中,我只能使用一次
var (success, a, b, ...) = Foo(...)
语法。此后,我被迫声明返回元组中的几乎所有变量,因为“成功”已经定义了 - 我不仅必须声明返回变量,还必须显式指定它们的类型(相对于隐式使用
var
)。
var (success, alpha) = GetAlpha();
if (success)
{
//var (success, beta, gamma) = GetStuff(alpha); // ERROR - 'success' is already defined
//(success, beta, gamma) = GetStuff(alpha); // ERROR - 'beta' and 'gamma' are undefined
//(success, var beta, var gamma) = GetStuff(alpha); // ERROR - no such syntax, silly!
string beta;
DateTime gamma;
(success, beta, gamma) = GetStuff(alpha);
.
.
.
使用隐式声明和类型的便利性和简洁性非常好,这让我很烦恼,我通常只能在方法中使用它一次。
我错过了什么吗?是否有其他模式可以避免这种情况?
最佳答案
我认为有一个论点认为,按照您尝试的方式重用变量是危险的。我个人更愿意看到这个:
var (alphaSucceeded, alpha) = GetAlpha();
if (alphaSucceeded)
{
var (getStuffSucceeded, beta, gamma) = GetStuff(alpha);
解决此类问题的方法有很多。
例如,您可以使用一元库(有很多: this is mine )来表示 GetAlpha()
的概念。返回非值。
var alphaMaybe = MaybeGetAlpha();
var stuff = alphaMaybe.Select(alpha => GetStuff(alpha)); // or just.Select(GetStuff)
或者,由于您当前只处理值类型,因此您可以使用 Nullable<>
s。在 C# 的更高版本中,您可以将 nullable 与引用类型一起使用,还可以使用模式匹配来简化语法。
if(GetAlpha() is int alpha)
{
// use alpha
}
关于c# - 从方法返回元组会导致麻烦的使用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74370006/