是否有一种方法可以使用Tuple类,但在其中提供项目的名称?
例如:
public Tuple<int, int, int int> GetOrderRelatedIds()
它返回OrderGroupId、OrderTypeId、OrderSubTypeId和OrderRequirementId的id。
让我的方法的用户知道哪个是哪个就好了。(当您调用该方法时,结果为result。Item1,结果。第二条,结果。Item3 result.Item4。不清楚哪个是哪个。)
(我知道我可以创建一个类来保存所有这些id,但这些id已经有自己的类,它们生活在其中,为这个方法的返回值创建一个类似乎很愚蠢。)
为什么每个人都让生活如此艰难。元组用于相当临时的数据处理。一直使用元组会使代码在某些时候非常难以理解。为所有东西创建类最终会使项目膨胀。
然而,这是关于平衡的……
你的问题似乎需要一门课程来解决。为了完整起见,下面这个类还包含构造函数。
这是合适的模式
自定义数据类型
没有进一步的功能。getter和setter也可以通过代码进行扩展,以“_orderGroupId”的名称模式获取/设置私有成员,同时还可以执行函数代码。
包括构造函数。如果所有属性都是强制的,也可以选择只包含一个构造函数。
如果希望使用所有构造函数,像这样冒泡是避免重复代码的正确模式。
public class OrderRelatedIds
{
public int OrderGroupId { get; set; }
public int OrderTypeId { get; set; }
public int OrderSubTypeId { get; set; }
public int OrderRequirementId { get; set; }
public OrderRelatedIds()
{
}
public OrderRelatedIds(int orderGroupId)
: this()
{
OrderGroupId = orderGroupId;
}
public OrderRelatedIds(int orderGroupId, int orderTypeId)
: this(orderGroupId)
{
OrderTypeId = orderTypeId;
}
public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId)
: this(orderGroupId, orderTypeId)
{
OrderSubTypeId = orderSubTypeId;
}
public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId, int orderRequirementId)
: this(orderGroupId, orderTypeId, orderSubTypeId)
{
OrderRequirementId = orderRequirementId;
}
}
或者,如果你想让它非常简单:你也可以使用类型初始化器:
OrderRelatedIds orders = new OrderRelatedIds
{
OrderGroupId = 1,
OrderTypeId = 2,
OrderSubTypeId = 3,
OrderRequirementId = 4
};
public class OrderRelatedIds
{
public int OrderGroupId;
public int OrderTypeId;
public int OrderSubTypeId;
public int OrderRequirementId;
}
TL:DR ->系统。ValueTuples可以自定义字段System的名称。元组不能。
澄清一下,在c# 7.0及更高版本中有两种不同类型的元组。
系统。元组
而且
系统。ValueTuple
当你通过tuple <…>类:
public Tuple<int, string, int> GetUserInfo();
您正在声明一个Tuple对象数据类型。
当你通过圆括号声明一个元组时:
public (int id, string name, int age) GetUserInfo();
您正在声明ValueTuple值数据类型。
每一个都有不同的功能和行为。在你的问题中,你的方法返回一个系统。元组对象。
不幸的是,通过系统创建的元组对象。元组类没有内置功能来给每个属性一个自定义名称。它们总是默认为ItemN,这取决于它们包含多少属性。
系统。另一方面,ValueTuple值可以包含自定义命名字段。
要了解更多信息,您可以参考Tuple类型(c#参考)和/或上面每个类的链接。但从本质上讲,文档强调的两种不同类型元组的一些关键区别是:
c#元组,由System。ValueTuple类型是不同的
由System表示的元组。Tuple类型。主要的
区别如下:
系统。ValueTuple类型是值类型。系统。元组类型是引用类型。
系统。ValueTuple类型是可变的。系统。元组类型是不可变的。
系统的数据成员。ValueTuple类型是字段。系统的数据成员。元组类型是属性。
如果你的方法需要返回一个System。元组对象,或者你更想要这种类型的对象的行为,那么在写这篇文章时,你无法实现你想要的。但是,如果您的方法可以返回System。ValueTuple值,然后您可以在返回值中给它自定义命名字段。
MichaelMocko回答得很好,
但我想补充一些我必须弄清楚的东西
(string first, string middle, string last) LookupName(long id)
如果你使用。net framework < 4.7,上面的Line会给你一个编译时错误
因此,如果你有一个使用。net framework < 4.7的项目,你仍然想使用ValueTuple,而不是安装这个NuGet包
更新:
从方法返回Named tuple并使用它的示例
public static (string extension, string fileName) GetFile()
{
return ("png", "test");
}
使用它
var (extension, fileName) = GetFile();
Console.WriteLine(extension);
Console.WriteLine(fileName);