c# - 从方法返回元组会导致麻烦的使用模式

标签 c# tuples c#-7.0

我一直在研究从方法返回元组,所以方法签名像这样......:

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/

相关文章:

c# - Log4net 缓冲区大小不起作用

c# - namespace 'System' 中不存在“ServiceModel”。当我尝试添加引用时,它说它已被引用

c# - 比较转换为对象的值类型

c# - 我可以将 TcpClient 从一台服务器传递到另一台服务器吗?

c# - 使用 bool 值的多个 orderby linq 查询

json - 如何在 C# 中将 *.RESX XML 文件转换为 JSON 文件

python - TypeError:只能将元组(不是 "float")连接到元组,密度公式有问题

swift - 从核心数据填充元组

C#7 :How can I deconstruct an object into a single value using a tuple?

c# - 从值元组创建子元组