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);
+ }
}
}