C# - 输出参数的语法糖?

时间:2009-04-14 16:54:13

标签: c# parameters syntactic-sugar

让我们暂时说一下,C#允许在最纯粹意义上的多个返回值,我们希望看到这样的内容:

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

压缩到:

string sender, receiver = message.GetParticipants();

在这种情况下,在实际调用方法之前,我不必理解方法的返回值。也许我依靠Intellisense来告诉我正在处理的返回值,或者我正在寻找一种能够从我不熟悉的类中返回我想要的方法。

同样,我们目前在C#中有这样的东西:

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

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

我的问题是,当前C#中是否存在任何语法糖,它允许开发人员在与方法调用相同的行中进行此声明?我认为它会使开发变得更加流畅,并且如果我做了类似的事情,也会使代码更具可读性:

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

显示接收者当场被宣布和分配。

10 个答案:

答案 0 :(得分:9)

不,目前还没有任何语法糖。我没有听说有任何意图介绍任何一个。

我不能说我经常使用out参数,因为它真的是我的一个重要问题(还有其他功能我宁愿C#团队花时间)但我同意这是一个有点烦人。

答案 1 :(得分:5)

.NET 4将添加一个Tuple概念,用于处理此问题。不幸的是,C#语言不会为“解构绑定”提供任何语言支持。

答案 2 :(得分:4)

就个人而言,我喜欢使用参数时引入的不便。它帮助我思考我的方法是否真的应该是它应该是什么,或者我是否已经填充了太多的功能。也就是说,C#4.0 / .Net 4中的动态类型可能会解决您的一些问题。

dynamic participant = message.GetParticipants();

var sender = participant.Sender;
var recipient = participant.Recipient;

,其中

public object GetParticipants()
{
     return new { Sender = ..., Recipient = ... };
}

答案 3 :(得分:2)

您还可以返回Tuple<T,U>或类似内容。但是,由于你想要返回两个字符串,它可能会让人感到困惑。

我使用BclExtras library的元组结构非常方便(在SO上找到它,谢谢JaredPar!)。

答案 4 :(得分:2)

我不认为这样的功能存在,但是如果以类似于perl中的数组的方式实现它实际上是有用的。

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

($user, $password) = split(/:/,$data);

答案 5 :(得分:2)

这最让我感到烦恼的是:因为没有({)DateTime.TryParse的重载没有out参数,你不能写

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

未声明d。我不知道这是out参数的问题,还是TryParse方法的实现方式,但这很烦人。

答案 6 :(得分:2)

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

int.TryParse(s, out var x);

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

尝试以下代码

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

答案 9 :(得分:-1)

我认为这不是你想要的。 您可能遇到过一段代码 喜欢那个。但变量突然冒出来,因为 它们已经在参数列表中引入了 个人噩梦(给我:))

从这一点来看,多个回报值具有严重的缺点 便携性/可维护性。如果你创建一个返回两个字符串的函数 而你现在希望它返回三个,你将不得不改变所有的代码 使用此功能。 然而,返回的记录类型通常在这种常见场景中表现良好。

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

对于线压缩:

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

行可以任何长度,因此您可以将一些常见的东西打包成一个。 试着用分号来生活。