zoukankan      html  css  js  c++  java
  • Tuple和 ValueTuple

    这个类型还是学习C#7.0的语法在看到的,这边单独拿来学习下。

    学习地址:

    https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples 

    https://docs.microsoft.com/zh-cn/dotnet/csharp/deconstruct

    C# 元组是使用轻量语法定义的类型,是一个泛型 。 其优点包括:更简单的语法,基于元素数量(称为“基数”)和元素类型的转换规则,以及一致的副本、相等测试和赋值规则。 

    缺点:Tuple 类将其属性命名为 Item1Item2 等。 这些名称未承载任何语义信息。 使用这些 Tuple 类型无法表达各属性的含义。Tuple 类因其引用类型会导致更多性能问题。

    在C#7.0和7.1的语法中新增了一些功能,改善了这些缺点。

    普通的Tuple

    var tuple = new Tuple<int, int,string>(1, 2,"hello");
                Console.WriteLine(tuple.Item1);
                Console.WriteLine(tuple.Item2);
                Console.WriteLine(tuple.Item3);

    新的元组 ValueTuple (这个需要你去安装nuget包)

      //需要我们在nuget上安装 System.ValueTuple
                var tuple = (1, 2);
                var tuple2 = ValueTuple.Create(1, 2);  
                var tuple3 = new ValueTuple<int, int>(1, 2);
    
                Console.WriteLine($"{tuple.Item1}and{tuple.Item2}");
    
    

     从 C# 7.1 开始,元组的字段名称可能会通过用于初始化此元组的变量提供。我们可以使用字段名称来代替 Item1,Item2

    ps: 设置查看项目的语言版本:项目——属性——生存——高级——语言版本

            var named = (first: "one", second: "two");
                Console.WriteLine($"{named.first}");   //7.0
                var sum = 12.5;
                var count = 5;
                var accumulation = (count, sum);
                Console.WriteLine($"{accumulation.count}");   //需要我们的语言版本是7.1
            (int a, int b) nullableTuple = (9, 8);  //左边命名
                Console.WriteLine(nullableTuple.a);
                (int a, int b) nullableTuple2 = (one: 9, two: 8);  //左右两边命名,右边的命名会被忽略
         //valueType作返回值
                var tt = TestValueTuple();
                Console.WriteLine(tt.i);
    
                (int i, int j) = TestValueTuple();
                Console.WriteLine(i);
    
                var (z, x) = TestValueTuple();
                Console.WriteLine(z);
               public static (int i, int j) TestValueTuple()
            {
                return (8, 9);
            }
    Deconstruct 析构该类型的实例   (只能是这个名称),Deconstruct还可以写成扩展方法
            public class Person
            {
                public string FirstName { get; set; }
                public string MiddleName { get; set; }
                public string LastName { get; set; }
                public string City { get; set; }
                public string State { get; set; }
    
                public Person(string fname, string mname, string lname,
                              string cityName, string stateName)
                {
                    FirstName = fname;
                    MiddleName = mname;
                    LastName = lname;
                    City = cityName;
                    State = stateName;
                }
    
                // Return the first and last name.
                public void Deconstruct(out string fname, out string lname)
                {
                    fname = FirstName;
                    lname = LastName;
                }
    
                public void Deconstruct(out string fname, out string mname, out string lname)
                {
                    fname = FirstName;
                    mname = MiddleName;
                    lname = LastName;
                }
    
                public void Deconstruct(out string fname, out string lname,
                                        out string city, out string state)
                {
                    fname = FirstName;
                    lname = LastName;
                    city = City;
                    state = State;
                }         
            }
     Person p = new Person("John", "Quincy", "Adams", "Boston", "MA");
    
                //他会根据你的前面的参数个数自动去匹配Deconstruct重载
                (string fName, string lName, string city, string state) = p;
                Console.WriteLine($"Hello {fName} {lName} of {city}, {state}!");
    
                (string name, string lname) = p;
                Console.WriteLine($"{name}");
  • 相关阅读:
    wince嵌入式应用程序开发环境搭建
    用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败
    git# 建立个人级服务器仓库 git init bare
    Bind和Eval的区别详解
    控件包含代码块(即 <% ... %>),因此无法修改控件集合 (转自http://blog.csdn.net/wangchao1982/archive/2007/11/19/1892472.aspx)
    Sys.ArgumentOutOfRangeException: Value must be an integer 错误的原因
    判断Cookies是否处于开启状态
    多个解决方案引用同一工程文件时冲突的解决方法
    javascript无提示的关闭页面
    Server.MapPath()
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/10339413.html
Copyright © 2011-2022 走看看