我刚刚观看了一个介绍C#7的新特性 https://www.youtube.com/watch?v=5ju2MuqKf_8。除此之外,它引入了返回元组类型的可能性(例如:(int, int)
,我相信,这只是一个语法糖Tuple<int, int>
)。因此,如果我们有一个返回多个值的方法,那么 C# 中有 3 种可能的实现方式:
(int first, int second) ReturnTuple()
{
return (1, 2);
}
int ReturnOutParam(out int second)
{
second = 2;
return 1;
}
CustomObject ReturnObject()
{
return new CustomObject
{
First = 1,
Second = 2
};
}
我相信,没有更多的方法可以做到这一点 - 如果是,请纠正我。
这三种方法中哪一种是正确的?剩下的两个在什么情况下可以使用呢?随着每一个新的 C# 版本的发布,我都感觉有一两个设计模式在 .NET 世界中已经过时了。有些功能非常有用(例如泛型、部分、LINQ、lambda、async/await 或 null 传播器)。其他的则是非常情境化的(动态的,nameof)。还有一些对我来说没有意义的东西(属性自动初始化器、元组返回值或本地函数)。
首先也是最重要的,像这样的元组(int, int)
是语法糖ValueTuple<int, int>
。之间的差异Tuple
and ValueTuple
are:
-
ValueTuple
是值类型,因此不需要在堆上分配对象
-
ValueTuple
是可变的
-
ValueTuple
具有(显然)内置语言支持,并且它允许您通过自定义属性命名元组项目(TupleElementNamesAttribute
). With Tuple
,你只会得到Item1
, Item2
etc.
每个新的语言版本都会有一些功能变得过时。例如,delegate { }
语法被 lambda 取代。你可能会争辩说out
参数属于这一类,但这是主观的。然而,所有功能都需要保留以实现向后兼容性。
例如,bool int.TryParse(string input, out int value)
应该成为int? int.TryParse(string input)
语言中包含了可空值类型,但旧函数已经存在于框架中,因此它必须保留。
我的经验法则是:对私有方法或实用函数使用值元组,但更喜欢对任何公共 API 使用成熟的结构,这样感觉更干净。我一般会避免out
params 除了偶尔用于私有方法之外。
我不明白为什么其中一些新功能对您来说没有意义:
- 属性自动初始化器是finally在那里,它们首先应该与自动属性一起实现,但由于时间限制可能被跳过。这对于代码可读性来说是一个明显的胜利,并且它添加了字段始终存在的功能。
- 元组返回值是您问题的主题,它也明显优于旧元组的可读性。能够为元组项目命名是不言而喻的。
- 局部函数对于实现迭代器模式来说大多是有用的,但我偶尔希望拥有这样的功能,并通过使用 lambda 来解决它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)