[C#7] 1.Tuples(元组)

1. 老版本代码

 

class Program

{

    static void Main(string[] args)

    {

        var fullName = GetFullName();


        Console.WriteLine(fullName.Item1);// Item1,2,3不能忍,,,

        Console.WriteLine(fullName.Item2);

        Console.WriteLine(fullName.Item3);

    }

    static Tuple<string, string, string> GetFullName() => new Tuple<string, string, string>("first name", "blackheart", "last name");

}

在有些场景下,我们需要一个方法返回一个以上的返回值,微软在.NET 4中引入了Tuple这个泛型类,可以允许我们返回多个参数,每个参数按照顺序被命名为 Item1;Item2,Item3 ,算是部分的解决了我们的问题,但是对于强迫症程序员来说,Item1,2,3的命名简直是不能忍的,,,so,在C#7中,引入了一个新的泛型类型ValueTuple<T>来解决这个问题,这个类型位于一个单独的dll(System.ValueTuple)中,可以通过nuget来引入到你当前的项目中(https://www.nuget.org/packages/System.ValueTuple/)。

2. ValueTuple

不废话,直接看代码:

class Program

{

    static void Main(string[] args)

    {

        var fullName = GetFullName();


        Console.WriteLine(fullName.First);  // 终于可以不是Item1,2,3了,,,

        Console.WriteLine(fullName.Middle);

        Console.WriteLine(fullName.Last);

    }


    static (string First, string Middle, string Last) GetFullName() => ("first name", "blackheart", "last name");

}

看出来差别了吗?我们终于可以用更直观的名字来替换掉该死的"Item1,2,3"了,看起来很棒吧。但是貌似我们并没有用到上面我提到的System.ValueTuple,我们翻开编译后的程序集看看:

internal class Program

{

    private static void Main(string[] args)

    {

        ValueTuple<string, string, string> fullName = Program.GetFullName();

        Console.WriteLine(fullName.Item1); // 原来你还是Item1,2,3,,,FUCK!!!

        Console.WriteLine(fullName.Item2);

        Console.WriteLine(fullName.Item3);

    }


    [TupleElementNames(new string[]

    {

            "First",

            "Middle",

            "Last"

    })]

    private static ValueTuple<string, string, string> GetFullName()

    {

        return new ValueTuple<string, string, string>("first name", "blackheart", "last name");

    }

}

不看不知道,一看吓一跳,原来我们的 fullName.First; 编译后居然还是 fullName.Item1 ,真是日了狗了。。。

不同之处在于GetFullName这个方法,编译器把我们简化的语法形式翻译成了 ValueTuple<string, string, string> ,还给加了一个新的Attribute(TupleElementNamesAttribute),然后把我们自定义的非常直观友好的“First”,"Middle","Last"当作元数据给存起来了。TupleElementNamesAttribute和ValueTuple一样,位于System.ValueTuple的单独dll中。

3. 总结

新的语法形式确实直观友好了好多,but,本质依然是借助泛型类型来实现的,同时也需要编译器对新语法形式的支持。

了解了本质是什么东西之后,以后在项目中环境允许的话,就放心大胆的使用吧(类型ValueTuple可以出现的地方,(first,last)这种新语法形式均可以)。

参考:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/


原文地址:http://www.cnblogs.com/linianhui/p/csharp7_tuple.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL

概述好久没写SQL语句&#xff0c;今天看到问答中的一个问题&#xff0c;拿来研究一下。问题链接&#xff1a;关于Mysql 的分级输出问题情景简介学校里面记录成绩&#xff0c;每个人的选课不一样,而且以后会添加课程&#xff0c;所以不需要把所有课程当作列。数据表里面数据如下…

Visual Studio 2017正式版离线安装及介绍

Visual Studio 2017 RTM正式版离线安装及介绍。 首先至官网下载&#xff1a;https://www.visualstudio.com/zh-hans/downloads/ VS 2017 正式版介绍&#xff1a; https://www.visualstudio.com/zh-hans/vs/whatsnew/ VS 2017 离线模式只离线.NET Core部分&#xff1a; Visual S…

Linux下查找命令

转载自 Linux下查找命令 一.Linux查找文件的相关命令 常 用 命 令 简要中文说明 程序所在目录 more 分页显示一个文件或任何输出结果 /bin less 分页显示一个文件并且可以回头 /usr/bin whereis 寻找文件工具 /usr/bin find 寻找文件工具 /usr/bin locate 寻…

Visual Studio 2017 新功能(上)

开发&#xff1a;快速导航、编写并修复代码 新的安装体验 - 降低了最小内存需求量以实现更快、更定制化的安装&#xff0c;并且支持脱机安装。 Visual Studio IDE - 大幅改进了 Visual Studio 2017&#xff0c;包括减少启动和解决方案加载时间、改进登录和标识、改进代码导航以…

2018蓝桥杯省赛---java---B---1(第几天)

题目描述 思路分析 31 29 31 30 4 125 答案 125

java 组件化_(原创)搭建一个组件化的监控平台

最近看到一位同事正在开发一个监控软件&#xff0c;要求就是通过针对服务器现有的一些接口&#xff0c;通过这些接口返回的数据进行分析&#xff0c;如果监控的值到达预先设定的范围则通过短信的方式发送给管理员。从整个开发的功能上来看是一个比较单一也很明确的功能&#xf…

微软发招,苹果发飙,React Native躺枪

这两天苹果和微软互怼&#xff0c;用脚本热更新的朋友要谨慎过 iOS 审核。 早上有Q群里面在讨论最近用 JavaScript 做为脚本层&#xff0c;在苹果商店审核遭拒的情况。 从目前多数信息来看&#xff0c;cocos2d-js 和 creator 这样用 SpiderMonkey JSB 技术栈的游戏情况尚好&am…

2018蓝桥杯省赛---java---B---2(方格计数)

题目描述 思路分析 圆的对称性 代码实现 package com.atguigu.TEST;class Main{public static void main(String[] args) {int ans0;for (int i 1; i < 1000; i) {for (int j 1; j < 1000; j) {if(i*ij*j<1000*1000){ans;}}}System.out.println(ans*4);//向四边发…

Visual Studio 2017 新功能(下)

调试和诊断 运行时单击 只需在调试运行到此行时单击代码行旁边的图标。 无需再设置临时断点&#xff0c;也不必再执行多个步骤来执行代码和在所需行停止。 现在&#xff0c;调试器下停在中断状态时&#xff0c;“运行时单击”图标会在鼠标悬停位置的代码行旁边巧妙显示。 将鼠…

2018蓝桥杯省赛---java---B---3(复数幂)

题目描述 思路分析 代码实现 package com.atguigu.TEST;import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.math.BigInteger;class Main{public static void main(String[] args) {BigInteger two BigInteger.valueOf(2)…

聚簇索引和聚簇索引介绍

转载自 聚簇索引和聚簇索引介绍 一. 什么是索引和建立索引的好处 什么是索引 在数据库中&#xff0c;索引的含义与日常意义上的“索引”一词并无多大区别&#xff0c;与书中的索引一样&#xff0c;数据库中的索引使您可以快速找到表中的特定信息。索引包含从表中一个或多个…

admiration音标是什么_英语admiration的意思解释|读音发音|相关词语_英语词典_词林在线词典...

admirationad.mi.ra.tion[ˌdmərєʃən; ˌdməˋrєiʃn]《admire 的名词》名词1 (U) 赞叹,钦佩,赞赏; 憧憬,羡慕[of, for]feel [have] ~ for? 钦佩 [佩服] …in ~ of? 赞赏…with ~赞赏 [钦佩] 地2 [the ~]众人赞赏之对象[of]She is the ~ of her students.她是学生们钦慕…

Visual Studio 20周年软件趋势随想

从2002年开始&#xff0c;.net让开发人员能快速构建和部署应用程序&#xff0c;便捷的开发windows和web服务器应用&#xff0c;同时著名的hacker Miguel de Icaza ,Miguel 为了GNOME项目启动了另一存志高远的项目&#xff1a;Mono&#xff0c;一个Microsoft .NET Framework的自…

普里姆算法(修路问题)+图解

图解 代码实现 package com.atguigu.prim;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/4/5* 描述*/ public class PrimAlgorithm {public static void main(String[] args) {//测试看看图是否创建OKchar[] data {A, B, C, D, E, F, G};int verxs data.length;/…

excel如何生成mysql的sql语句_excel 批量生成SQL语句

文章来源&#xff1a;https://www.cnblogs.com/allen0118/p/3726455.html我们经常会遇到这样的要求&#xff1a;用户给发过来一些数据&#xff0c;要我们直接给存放到数据库里面&#xff0c;有的是Insert&#xff0c;有的是Update等等&#xff0c;少量的数据我们可以采取最原始…

Visual Studio 2017 已知问题 Qamp;amp;A

已知问题 以下是有关此版本中的已知问题和可用解决方法的说明。M姐会给大家进行详细的解答 安装问题编辑器和 IDE 问题NuGet 问题实时单元测试问题测试工具问题轻量级解决方案加载问题Web 工具已知问题.NET Core 工具问题“打开文件夹”问题扩展性问题Application Insights 问题…

2017蓝桥杯省赛---java---B---8(包子凑数)

题目描述 标题&#xff1a;包子凑数小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。每当有顾客想买X个包子&#xff0c;卖包子的大叔就会迅速选出若干笼包…

java 配置mybatis_java mybatis框架的配置

一个框架的使用&#xff0c;必然离不开其中的组件支持。我们在下载完mybatis框架后&#xff0c;因为大部分的内部结构还没有启动&#xff0c;就要手动的对其进行配置。在之前有提到&#xff0c;mybatis框架的作用就有数据库方面的&#xff0c;所以本篇文章带来了数据库和sql方面…

2017蓝桥杯省赛---java---B---9(分巧克力)

题目描述 标题&#xff1a; 分巧克力儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的…

C#7.0之ref locals and returns (局部变量和引用返回)

首先我们知道 ref关键字是将值传递变为引用传递 那么我们先来看看ref locals(ref局部变量) 列子代码如下: static void Main(string[] args) { int x 3; ref int x1 ref x; //注意这里,我们通过ref关键字 把x赋给了x1 x1 2; Console.WriteLine($"改变后的变量 {nameo…