我需要从方法中返回2个值(字符串和一个点),我真的不想使用ref / out,因为值应该保持在一起。
我在考虑使用Dictionary<string, Point>
。
我的问题是:如果只有一个KeyValuePair,字典是数据结构的一个很好的选择吗?或者还有其他合适的选择吗?
答案 0 :(得分:5)
如果您不想创建命名类,可以使用Tuple返回多个参数
Tuple<int, Point> tuple =
new Tuple<int, Point>(1, new Point());
return tuple
答案 1 :(得分:4)
您可以创建自己的课程。但是Tuple<T1, T2>
可能很方便。当你需要传递一个包含几种不同类型的对象时,它只适用于那种事情。
我倾向于创建一个类,除非通过定义非常清楚元组是什么。这样你就可以给它一个提高可读性的名字。如果您以后确定有两个以上的值,它也可以节省维护麻烦。您可以维护一个课程,而不是在多个地方用Tuple<int, Point>
替换Tuple<int, Point, Something>
。
我不会使用KeyValuePair
,因为有人看着它会合理地假设图片中有某个字典,所以会产生一些混乱。如果只有两个值而没有字典则没有密钥。
答案 2 :(得分:2)
我使用Class或Structure来存储这两个值。我更喜欢它来维护代码并允许您将来扩展系统。
public class MyData {
public string MyString {get;set;}
public Point MyPoint {get;set;}
}
public class Storage {
public MyData retrieveMyData() {
MyData data = new MyData();
return data;
}
}
答案 3 :(得分:1)
每当你看到这个,你应该停下来思考“这应该是一个对象吗?” 如果它是一个一个你可以使用元组,但大多数时候你会想出一个相同的参数再次结合使用的情况。到那时,你会希望你第一次创建了一个对象。
通过为参数集创建对象,您可以为其指定一个可提高可读性的名称。如果将参数封装到对象的属性中,您还可以创建getter和setter方法,这将允许您进一步控制对它们的访问,并在将来需要时添加更多功能。
最重要的是可读性。我可以称之为NamedPoint,告诉任何人阅读我的代码为什么我将字符串和点组合在一起。如果我想让它成为一定长度,或者不以数字或任何其他数字开头,我可以稍后对名称添加验证。