[译]C# 7系列,Part 1: Value Tuples
2021-01-26 21:20
标签:The efault back 数值 实例 方法 rar min mic Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值。 原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/26/c-7-series-part-1-value-tuples/ 译文: 从今天开始,我将开始一个新的C# 7系列文章,介绍C# 7+的新语言特性。请注意,我说的不是C# 7.0,我说的是C# 7+,因为将会有一些小的版本(比如7.1、7.2)逐步引入新的特性(感谢Roslyn!),比如async Main和default literals。 Tuples 类System.Tuple提供了一种类型来表示类似属性包的键值对。当你想用一种数据结构来保存一个带有属性(元素)的对象,但又不想创建一个单独的类型的时候,你可以使用它。下面的代码展示了如何用它作为一个方法的返回值,这个返回值包含了学生姓名和年龄。 可以看到,我返回了一个Tuple 你可以通过引用Item1和Item2来访问name和age。 Tuple类有一些明显的问题: Value Tuples C# 7.0引入了ValueTuple结构,它是Tuple对象的值类型表示。C#语言团队为这个值元组类型做了很多不错的事情,包括新的语法和许多特性(比如解构)。 下面是使用Value Tuples的重写版本,请注意,如果在你的项目中不能用ValueTuple类型,那你必须通过NuGet下载System.ValueTuple 4.3.0 NuGet包到你的项目。如果您使用的是.Net Framework 4.7或更高版本,或者.Net Standard Library 2.0或更高版本,你什么也不用做,ValueTuple已经包含在内了。 通过使用语法(),上面的代码得到了极大的简化。 帅!现在你的元组对象中的元素有了好的元数据,那么你就不需要来回检查确认返回/访问元素的顺序是正确的了。 当您使用值元组时,Visual Studio IDE会给您提示。
Value Tuple 解构 您可以从值元组对象中解构元素,并访问局部变量。 如果只关心某些元素而不是所有元素,可以使用_关键字忽略局部变量。 从Value Tuples到Tuples 类型System.Tuple和System.ValueTuple提供了一些扩展方法来帮助它们之间相互转换。 结论 ValueTuple使C#语言更现代,更易于使用简化的语法。它解决了许多Tuple的问题: 由于值元组元素的名称不是运行时的,所以在使用一些类库(如Newtonsoft)进行序列化时,必须小心使用元组类型。除非你更新过支持新元数据(TupleElementNameAttribute等)的类库,否则你会遇到bug。 [译]C# 7系列,Part 1: Value Tuples 标签:The efault back 数值 实例 方法 rar min mic 原文地址:https://www.cnblogs.com/wenhx/p/c-7-series-part-1-value-tuples.htmlpublic Tuplestring, int> GetStudentInfo(string id)
{
// Search by ID and find the student.
return new Tuplestring, int>("Annie", 25);
}
public void Test()
{
Tuplestring, int> info = GetStudentInfo("100-000-1000");
Console.WriteLine($"Name: {info.Item1}, Age: {info.Item2}");
}
public (string, int) GetStudentInfo(string id)
{
// Search by ID and find the student.
return ("Annie", 25);
}
public void Test()
{
(string, int) info = GetStudentInfo("100-000-1000");
Console.WriteLine($"Name: {info.Item1}, Age: {info.Item2}");
}
您甚至可以为ValueTuple中的每个元素指定一个名称,如下所示:public (string name, int age) GetStudentInfo(string id)
{
// Search by ID and find the student.
return (name: "Annie", age: 25);
}
public void Test()
{
(string name, int age) info = GetStudentInfo("100-000-1000");
Console.WriteLine($"Name: {info.name}, Age: {info.age}");
}
// 解构使用 var (x, y) 语法,
// 或者 (var x, var y) 语法。
var (name, age) = GetStudentInfo("100-000-1000");
// 现在你有两个局部变量:name and age.
Console.WriteLine($"Name: {name}, Age: {age}");
var (name, _) = GetStudentInfo("100-000-1000");
// 现在你只有一个局部变量:name,值age被忽略了。
Console.WriteLine($"Name: {name}");
var valueTuple = (id: 1, name: "Annie", age: 25, dob: DateTime.Parse("1/1/1993"));
var tuple = valueTuple.ToTuple();
请注意,与元组元素相关联的名字不是一个运行时的元数据,即在运行时的实例值元组中不存在这样一个名称的属性/字段,属性的名称仍Item1、Item2等等,所有的元素名称仅存在设计和编译阶段。
文章标题:[译]C# 7系列,Part 1: Value Tuples
文章链接:http://soscw.com/index.php/essay/47452.html