使用new创建名称ValueTuple属性

我知道当我创建一个隐式的元组时,我可以命名参数:

var me = (age: 21, favoriteFood: "Custard"); 

是否可以在明确创建元组时命名参数? 即

 var me = new ValueTuple(21, "Custard"); 

不,你不能。 ValueTuple类型实际上独立于C#中的命名字段支持。 后者更像是匿名类型的命名属性。 也就是说,编译器会根据您的声明和用法分析代码并为相应的成员生成别名。 通过赋值,编译器可以学习字段的名称。 由于基本构造函数语法不提供命名字段的机制,因此不能使用它直接生成带有命名字段的元组。

当然,有一些方法可以重新解释从构造函数语法返回的值,为返回的值赋值。 我假设你已经意识到这种方法并正在寻找更直接的东西。

作为我所说的“重新解释”的一个例子,你可以这样做:

 static (int value, string text) ConvertToNamed((int value, string text) t) { return t; } 

然后这将在一个新变量中命名字段:

 var t1 = new ValueTuple(21, "hello"); var t2 = ConvertToNamed(t1); 

变量t1Item1Item2粘在一起。 但编译器将隐式生成变量t2的所需名称。

也许更好的例子是你不需要额外的方法:

 (int value, string text) t = new ValueTuple(21, "hello"); 

同样,您并没有真正命名构造函数语法中的字段,但它们会被局部变量声明重新解释。

这可能不是一个严重的限制。 在需要具有持久且易于分配的名称的情况下,声明用户定义的类型可能比使用元组语法更好。 你也可以为用户定义的类型编写解构器,并且声明类似的类型意味着当涉及到reflection, dynamic等时,名称是一等公民。

我不相信。 以下是我在ValueTuple上找到的文档:

https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-7?view=netframework-4.7

我个人没有使用过ValueTuble类型。 我之前使用过Tuple类:

 var tuple = new Tuple(21, "Custard"); var number = tuple.Item1; var st = tuple.Item2; 

但是我发现使用元组,特别是当通过方法笨重时。 始终必须知道Item1和Item2等中的内容。根据ValueTuple文档,它以相同的方式使用。

你不应该只做一个实体课吗?

我使用了Anonymous Type,我认为它符合您的需求。

 var anyom = new { age = 21, favoriteFood = "Custard" }; number = anyom.age; st = anyom.favoriteFood;