代码之家  ›  专栏  ›  技术社区  ›  JoshJordan

C#-out参数的语法糖?

  •  8
  • JoshJordan  · 技术社区  · 15 年前

    string sender = message.GetSender();
    string receiver = message.GetReceiver();
    

    压实至:

    string sender, receiver = message.GetParticipants();
    

    在这种情况下,我不必理解方法的返回值,直到我真正进行方法调用。也许我依赖Intellisense来告诉我正在处理什么返回值,或者也许我正在搜索一个方法,从我不熟悉的类中返回我想要的。

    string receiver;
    string sender = message.GetParticipants(out receiver);
    

    其中GetParticipants的参数是 字符串参数。但是,这与上面的有点不同,因为这意味着我必须使用创建变量以保存out参数结果的代码进行抢占,或者至少返回并编写代码。这有点违反直觉。

    我的问题是,在当前的C#中是否有语法糖,允许开发人员在方法调用的同一行中进行此声明?我认为这会使开发变得(非常)流畅,而且如果我做了以下事情,代码的可读性也会更高:

    string sender = message.GetParicipants(out string receiver);
    

    表明接收人在现场被宣布和分配。

    10 回复  |  直到 15 年前
        1
  •  9
  •   Jon Skeet    15 年前

    不,目前没有任何语法上的甜点。我也没听说过有人打算介绍。

    out 参数常常足以让我非常担心(我更希望C#团队花时间研究其他功能),但我同意这有点烦人。

        2
  •  5
  •   wekempf    15 年前

    .NET4将添加一个元组概念来处理这个问题。不幸的是,C语言不会为“解构绑定”提供任何语言支持。

        3
  •  4
  •   tvanfosson    15 年前

    就我个人而言,我喜欢使用out参数时引入的incovience。它帮助我思考我的方法是否真的在做它应该做的事情,或者我是否在其中塞进了太多的功能。也就是说,也许C#4.0/.NET4中的动态键入可以解决您的一些问题。

    dynamic participant = message.GetParticipants();
    
    var sender = participant.Sender;
    var recipient = participant.Recipient;
    

    哪里

    public object GetParticipants()
    {
         return new { Sender = ..., Recipient = ... };
    }
    
        4
  •  2
  •   Jabe    15 年前

    您还可以返回 Tuple<T,U> 或者类似的东西。但是,由于您希望返回两个字符串,因此可能会造成混淆。

    我使用 BclExtras library 这是非常方便的(发现它如此,谢谢你JaredPar!)。

        5
  •  2
  •   Michał Piaskowski    15 年前

    在perl中,可以将数组分配给括号中的变量列表。例如,你可以这样做

    ($user, $password) = split(/:/,$data);
    
        6
  •  2
  •   Robert Rossney    15 年前

    DateTime.TryParse 那不需要一个小时 out 参数,您不能写入

    if (DateTime.TryParse(s, out d))
    {
       return new ValidationError("{0} isn't a valid date", s);
    }
    

    不申报 d . 我不知道这是否是一个问题 TryParse 方法已实现,但它很烦人。

        7
  •  2
  •   Craig    10 年前

    这个语法糖现在在roslyn预览版中提供 as seen here (called Declaration expressions) .

    int.TryParse(s, out var x);
    
        8
  •  0
  •   Adam Robinson    15 年前

    充其量你只能使用 var 而不是显式类型,除非您希望将所有多个返回值限制为同一类型(不太可能实际)。您还将限制变量的范围;目前,您可以在更高的范围内声明变量,并在out参数中初始化它。使用这种方法,变量将在与其赋值相同的块中超出范围。显然,这在某些情况下是可用的,但我不想将其作为一般规则强制执行。显然你可以离开 out 选项已经到位,但人们很可能会为一种或另一种方法编写代码。

        9
  •  -1
  •   AndreasT    15 年前

    我想这不是你想要的。 您可能会遇到一段代码,您可能会 我喜欢这样。但是变数不知从哪里冒出来,因为 它们已在参数列表中引入 个人噩梦(对我来说:)

    多个返回值在这一点上有严重的缺点 如果你现在想让它返回3,你必须修改所有的代码 使用此函数的。 然而,返回的记录类型在这种常见场景中通常表现良好。

    你可能正在打开潘多拉的盒子;-)

    对于线路压实:

    string s1, s2; s1 = foo.bar(s2);
    

    台词可以是 长度,所以你可以把一些普通的东西打包成一个。 试着用分号生活。

        10
  •  -1
  •   Patrick D'Souza ob1    11 年前

    请尝试以下代码

    Participants p = message.GetParticipants();
    log(p.sender,p.receiver);