元组是许多开发人员可能不经常在日常工作中用到的东西,但是他们有几个不同的用途。随着最新的即将发布的C#的到来,这个现象可能会改变,因为元组作为主要的扩充,将可能在现实世界中得到更多的应用。
下面看看MSDN的描述:
元组是具有特定数列和元素序列的数据结构。例如,使用一个包含三个元素的元组(叫做三元组)来保存一个人的特征,第一个元素保存人的姓名,第二个元素保存生日,第三个元素保存这个人的一年的收入。
更通俗的说,你可以将他视为一个不含任何实际属性的类,或者由于你懒于创建一个类去实现一些行为而用于替代的东西。
其它翻译版本 (1) 加载中举例来说,假设你要创建一个类来存储城市/州组合你可以这样传递:
public class Location { public string City { get; set; } public string State { get; set; } public Location(string city, string state) { City = city; State = state; } }// Examplevar location = new Location("Lake Charles","LA"); // Print out the addressvar address = $"{location.City}, {location.State}";
你可以用一个元组做同样的事情,但是显然少了很多描述性的东西:
var location = new Tuple<string,string>("Lake Charles","LA"); // Print out the addressvar address = $"{location.Item1}, {location.Item2}";
所以在某些场景中,尤其是应急的时候,元组对象就会很有用。MSDN 有一些 常用的用例,你可能会希望看一下。
好吧,C# 7.0引入了一个新的特性,少量开发者已经提问的:多个返回值。
没错,你可以书写类似如下的代码而无需创建一个类,仅仅是使用一个元组类型,或者一系列的ref或out参数即可实现:
public (string city, string state) GetCityAndState() { return ("Lake Charles","Louisiana"); }
这允许你调用单个方法,并通过他们定义的名称访问每个返回值,如下所示:
var result = GetCityAndState(); var city = result.city; // 得到"Lake Charles" var state = result.state // 得到"Louisiana"
这些多个返回值方法的结果也可以根据你的需求以各种方式重建:
// 使用两个明确定义的返回值 (string city, string state) = GetCityAndState(); // 使用var而不是现实类型定义 (var city, var state) = GetCityAndState(); // 对多个变量使用单个var声明 var (city, state) = GetCityAndState(); // 使用现有变量 (city,state) = GetCityAndState();
通过想象,你可以初始化元组使用下面类似的语句完成:
var location = ("Lake Charles", "Louisiana");
这是一个其他主流编程语言如Python, Scala, Ruby, Go和其他语言都已经拥有的一个特性,所以希望他对C#也是一个很好的补充。
除了上文提供的直接示例之外,这些新的ValueTuple对象可以使用类型推断去匹配返回的值的类型来保证他是有效的,如下面的例子:
public (string city, int population) FindBiggestCityWithPopulation(string state) { var result = (city: "", population: 0); result.city = _someService.GetBiggestCity(state); result.population = _someService.GetPopulation(result.city); return result; }
同样的,这些新的元组也支持async/await模式:
public async Task(string bird, string flower) GetStateBirdAndFlowerAsync(string state) { var bird = await _someService.GetStateBirdAsync(state); var flower = await _someService.GetStateFlower(state); return (bird,flower); }
“新的”微软开发生态系统一个奇妙的东西就是他很开放。不再是在充满烟味的房间里独自决定重要的发展决定,而是在GitHub上公开问题。
如果你想看看导致这个功能的谈话的话,你可以点击此处访问多个返回值的提案。你也可以考虑通过其他活动问题来了解什么功能可能会即将推出。
License
本文以及任何相关的源代码和文件均以获得The Code Project Open License (CPOL)许可。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务