diff --git a/TupleStudy/ValueTupleStudy.cs b/TupleStudy/ValueTupleStudy.cs index 189a4f2..2fcb038 100644 --- a/TupleStudy/ValueTupleStudy.cs +++ b/TupleStudy/ValueTupleStudy.cs @@ -191,6 +191,69 @@ namespace TupleStudy } #endregion + #region 优化:解构ValueTuple + //注意:通过var (x, y)或者(var x, var y)来解析值元组元素构造局部变量, + //同时可以使用符号”_”来忽略不需要的元素。 + + /// + /// 简化值元组创建语法 + /// + public (int userId, string userName, int userAge) SingleCreateValueTuple() + { + //回为函数返回值已经重命名,创建时再次命名已没有意义 + //return (userId: 1, userName: "wanggaofeng", userAge: 18); + + return (1, "王高峰",18); + } + #endregion + + #region 方法返回多个值 + + /// + /// 方法返回一组定义了类型并已经命名的数据 + /// + /// + /// 定义了类型并已经命名的一组数据 + /// + public (int userId, string userName, uint userAge) GetNamedValueTuple() + { + var tuple = ValueTuple.Create(1, "王高峰", 18); + return tuple; + } + + /// + /// 方法返回一组只定义,未命名的的数据 + /// + /// + /// 只定义类型,未命名的一组数据 + /// + public (int, string, uint) GetUnNamedValueTuple() + { + var tuple = ValueTuple.Create(1, "王高峰", 18); + return tuple; + } + #endregion + + #region ValueTuple做为方法的参数 + + /// + /// ValueTuple做为方法的参数 + /// + public bool ValueTupleAsParameterForMether(object valueTuple) + { + try + { + var student = (ValueTuple)valueTuple; + //保存操作 + + return true; + } + catch + { + return false; + } + } + #endregion } } diff --git a/TupleStudyTest/TupleStudyTest.csproj b/TupleStudyTest/TupleStudyTest.csproj index d8fe43b..453b610 100644 --- a/TupleStudyTest/TupleStudyTest.csproj +++ b/TupleStudyTest/TupleStudyTest.csproj @@ -60,7 +60,6 @@ - diff --git a/TupleStudyTest/ValueTupleStudyTest.cs b/TupleStudyTest/ValueTupleStudyTest.cs deleted file mode 100644 index d75e903..0000000 --- a/TupleStudyTest/ValueTupleStudyTest.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Xunit; -using Xunit.Abstractions; -using Xunit.Extensions; -using Xunit.Sdk; - -using TupleStudy; - -namespace TupleStudyTest -{ - public class ValueTupleStudyTest - { - private ValueTupleStudy valueTupleStudy; - - public ValueTupleStudyTest() - { - valueTupleStudy = new ValueTupleStudy(); - } - - /// - /// 使用构造函数创建值元组 - /// - [Fact] - public void CreateValueTuple_Test() - { - //创建包含零个元组的值元组 - System.ValueTuple zeroTuple = this.valueTupleStudy.CreateValueTuple(); - Assert.IsType(zeroTuple); - - //1个元组的值元组 - var oneTuple = valueTupleStudy.CreateValueTuple(1); - Assert.Equal(1, oneTuple.Item1); - Assert.Equal("first", new ValueTuple("first").Item1); - - //2个元组的值元组 - var twoTuple = valueTupleStudy.CreateValueTuple(1, 2); - Assert.Equal(1, twoTuple.Item1); - Assert.Equal(2, twoTuple.Item2); - - //3个元组的值元组 - var threeTuple = valueTupleStudy.CreateValueTuple(1, 2, 3); - Assert.Equal(1, threeTuple.Item1); - Assert.Equal(2, threeTuple.Item2); - Assert.Equal(3, threeTuple.Item3); - - - //4个元组的值元组 - var fourTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4); - Assert.Equal(1, fourTuple.Item1); - Assert.Equal(2, fourTuple.Item2); - Assert.Equal(3, fourTuple.Item3); - Assert.Equal(4, fourTuple.Item4); - - //5个元组的值元组 - var fiveTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5); - Assert.Equal(1, fiveTuple.Item1); - Assert.Equal(2, fiveTuple.Item2); - Assert.Equal(3, fiveTuple.Item3); - Assert.Equal(4, fiveTuple.Item4); - Assert.Equal(5, fiveTuple.Item5); - - //6个元组的值元组 - var sixTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6); - Assert.Equal(1, sixTuple.Item1); - Assert.Equal(2, sixTuple.Item2); - Assert.Equal(3, sixTuple.Item3); - Assert.Equal(4, sixTuple.Item4); - Assert.Equal(5, sixTuple.Item5); - Assert.Equal(6, sixTuple.Item6); - - //7个元组的值元组 - var sevenTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6, 7); - Assert.Equal(1, sevenTuple.Item1); - Assert.Equal(2, sevenTuple.Item2); - Assert.Equal(3, sevenTuple.Item3); - Assert.Equal(4, sevenTuple.Item4); - Assert.Equal(5, sevenTuple.Item5); - Assert.Equal(6, sevenTuple.Item6); - Assert.Equal(7, sevenTuple.Item7); - - //8个及以上元组的值元组:元组嵌套 - var overSevenTuple = valueTupleStudy.CreateValueTuple>(1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9, 10)); - Assert.Equal(1, overSevenTuple.Item1); - Assert.Equal(2, overSevenTuple.Item2); - Assert.Equal(3, overSevenTuple.Item3); - Assert.Equal(4, overSevenTuple.Item4); - Assert.Equal(5, overSevenTuple.Item5); - Assert.Equal(6, overSevenTuple.Item6); - Assert.Equal(7, overSevenTuple.Item7); - - //元组嵌套 - Assert.Equal(8, overSevenTuple.Item8); - Assert.Equal(9, overSevenTuple.Item9); - Assert.Equal(10, overSevenTuple.Item10); - - //16个以上,要审视程序设计,是否确实需要使用ValueTuple,最好改成设计成类 - } - - [Fact] - public void GetValueTuple_Test() - { - Assert.Equal(1, 1); - } - } -} diff --git a/ValueTupleStudyTest/ValueTupleStudyTest.cs b/ValueTupleStudyTest/ValueTupleStudyTest.cs index 0633cb8..7cd3f9a 100644 --- a/ValueTupleStudyTest/ValueTupleStudyTest.cs +++ b/ValueTupleStudyTest/ValueTupleStudyTest.cs @@ -97,12 +97,212 @@ namespace ValueTupleStudyTest Assert.Equal(6, overSevenTuple.Item6); Assert.Equal(7, overSevenTuple.Item7); - //元组嵌套 + //元组嵌套: + //注意 构造方法创建的可以直接用 Item8 Item9等来引用,静态方法创建的,则要用 valueTuple.Item8.Item1 这种方式。 Assert.Equal(8, overSevenTuple.Item8); Assert.Equal(9, overSevenTuple.Item9); Assert.Equal(10, overSevenTuple.Item10); //16个以上,要审视程序设计,是否确实需要使用ValueTuple,最好改成设计成类 } + + /// + /// 使用静态Create方法 创建值元组 + /// + [Fact] + public void GetValueTuple_Test() + { + //创建包含零个元组的值元组 + var zeroTuple = valueTupleStudy.GetValueTuple(); + Assert.IsType(zeroTuple); + + //1个元组的值元组 + var oneTuple = valueTupleStudy.GetValueTuple(1); + Assert.Equal(1, oneTuple.Item1); + Assert.Equal("first", new ValueTuple("first").Item1); + + //2个元组的值元组 + var twoTuple = valueTupleStudy.GetValueTuple(1, 2); + Assert.Equal(1, twoTuple.Item1); + Assert.Equal(2, twoTuple.Item2); + + //3个元组的值元组 + var threeTuple = valueTupleStudy.GetValueTuple(1, 2, 3); + Assert.Equal(1, threeTuple.Item1); + Assert.Equal(2, threeTuple.Item2); + Assert.Equal(3, threeTuple.Item3); + + + //4个元组的值元组 + var fourTuple = valueTupleStudy.GetValueTuple(1, 2, 3, 4); + Assert.Equal(1, fourTuple.Item1); + Assert.Equal(2, fourTuple.Item2); + Assert.Equal(3, fourTuple.Item3); + Assert.Equal(4, fourTuple.Item4); + + //5个元组的值元组 + var fiveTuple = valueTupleStudy.GetValueTuple(1, 2, 3, 4, 5); + Assert.Equal(1, fiveTuple.Item1); + Assert.Equal(2, fiveTuple.Item2); + Assert.Equal(3, fiveTuple.Item3); + Assert.Equal(4, fiveTuple.Item4); + Assert.Equal(5, fiveTuple.Item5); + + //6个元组的值元组 + var sixTuple = valueTupleStudy.GetValueTuple(1, 2, 3, 4, 5, 6); + Assert.Equal(1, sixTuple.Item1); + Assert.Equal(2, sixTuple.Item2); + Assert.Equal(3, sixTuple.Item3); + Assert.Equal(4, sixTuple.Item4); + Assert.Equal(5, sixTuple.Item5); + Assert.Equal(6, sixTuple.Item6); + + //7个元组的值元组 + var sevenTuple = valueTupleStudy.GetValueTuple(1, 2, 3, 4, 5, 6, 7); + Assert.Equal(1, sevenTuple.Item1); + Assert.Equal(2, sevenTuple.Item2); + Assert.Equal(3, sevenTuple.Item3); + Assert.Equal(4, sevenTuple.Item4); + Assert.Equal(5, sevenTuple.Item5); + Assert.Equal(6, sevenTuple.Item6); + Assert.Equal(7, sevenTuple.Item7); + + //8个及以上元组的值元组:元组嵌套 + var overSevenTuple = valueTupleStudy.GetValueTuple>(1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9, 10)); + Assert.Equal(1, overSevenTuple.Item1); + Assert.Equal(2, overSevenTuple.Item2); + Assert.Equal(3, overSevenTuple.Item3); + Assert.Equal(4, overSevenTuple.Item4); + Assert.Equal(5, overSevenTuple.Item5); + Assert.Equal(6, overSevenTuple.Item6); + Assert.Equal(7, overSevenTuple.Item7); + + //元组嵌套 + //注意 构造方法创建的可以直接用 Item8 Item9等来引用,静态方法创建的,则要用 valueTuple.Item8.Item1 这种方式。 + Assert.Equal(8, overSevenTuple.Item8.Item1); + Assert.Equal(9, overSevenTuple.Item8.Item2); + Assert.Equal(10, overSevenTuple.Item8.Item3); + + //16个以上,要审视程序设计,是否确实需要使用ValueTuple,最好改成设计成类 + } + + /// + /// 自定义值元组项的名字 + /// + [Fact] + public void CustomName_ValueTuple_Test() + { + //使用var + var (userId,userName,userAge) = ValueTuple.Create(1, "wanggaofeng", 18); + Assert.Equal(1, userId); + Assert.Equal("wanggaofeng", userName); + Assert.Equal(18, userAge); + + + //不使用var, 放()内 + (int id, string name, int age) = ValueTuple.Create(1, "wanggaofeng", 18); + Assert.Equal(1, id); + Assert.Equal("wanggaofeng", name); + Assert.Equal(18, age); + } + + /// + /// 简化值元组的创建方法 + /// + [Fact] + public void SingleCreateValueTuple_Test() + { + //自定义名称 + var student = (userId: 1, userName: "wanggaofeng", userAge: 18); + Assert.Equal(1,student.userId); + Assert.Equal("wanggaofeng", student.userName); + Assert.Equal(18, student.userAge); + + //默认名称 + var student2 = (1, "wanggaofeng", 18); + Assert.Equal(1, student2.Item1); + Assert.Equal("wanggaofeng", student2.Item2); + Assert.Equal(18, student2.Item3); + + //方法返回值,方法中已命名 + var student3 = valueTupleStudy.SingleCreateValueTuple(); + Assert.Equal(1, student3.userId); + Assert.Equal("王高峰", student3.userName); + Assert.Equal(18, student3.userAge); + } + + [Fact] + public void GetNamedValueTuple_Test() + { + //使用引用方法的命名 + var student = valueTupleStudy.GetNamedValueTuple(); + Assert.Equal(1, student.userId); + Assert.Equal("王高峰", student.userName); + Assert.Equal(18U, student.userAge); + + //接收时重新命名 + var (id, name, age) = valueTupleStudy.GetNamedValueTuple(); + Assert.Equal(1, id); + Assert.Equal("王高峰", name); + Assert.Equal(18U, age); + + //不使用命名 + ValueTuple tuple = valueTupleStudy.GetNamedValueTuple(); + Assert.Equal(1, tuple.Item1); + Assert.Equal("王高峰", tuple.Item2); + Assert.Equal(18U, tuple.Item3); + } + + [Fact] + public void GetUnNamedValueTuple_Test() + { + //接收时重新命名 + var (userId, userName, userAge) = valueTupleStudy.GetUnNamedValueTuple(); + + Assert.Equal(1,userId); + Assert.Equal("王高峰", userName); + Assert.Equal(18U, userAge); + + //使用默认 + var student = valueTupleStudy.GetUnNamedValueTuple(); + Assert.Equal(1, student.Item1); + Assert.Equal("王高峰", student.Item2); + Assert.Equal(18U, student.Item3); + + ValueTuple tuple = valueTupleStudy.GetUnNamedValueTuple(); + Assert.Equal(1, tuple.Item1); + Assert.Equal("王高峰", tuple.Item2); + Assert.Equal(18U, tuple.Item3); + } + + /// + /// 接收方法返回元组值时,忽略不需要的荐 + /// + [Fact] + public void IgnoreItem_ValuleTuple_Test() + { + //接收时重新命名,并忽略不需要的项:用_表示忽略的项 + var (_, userName, _) = valueTupleStudy.GetUnNamedValueTuple(); + Assert.Equal("王高峰",userName); + + //另一种方法 + (_, string userName2, _) = valueTupleStudy.GetUnNamedValueTuple(); + Assert.Equal("王高峰", userName2); + } + + /// + /// 值元组做为方法参数 测试 + /// + [Fact] + public void ValueTupleAsParameterForMether_Test() + { + var para = (userId:1,userName:"wanggaofeng", userAge:18); + var result = valueTupleStudy.ValueTupleAsParameterForMether(para); + Assert.True(result); + + var para2 = (1,2,3); + var result2 = valueTupleStudy.ValueTupleAsParameterForMether(para2); + Assert.False(result2); + } } }