元组实现
Tuples implementation
抱歉,如果重复。我找不到关于那件事的完整解释。
而且 MSDN 像往常一样含糊不清......
.Net 元组是否为开箱即用的 equals 和 GetHashCode 提供可用的实现?
(因此 == 运算符)
我可以期望一个元组在默认情况下比较它的所有项目,还是我必须提供一个 IEqualityComparer,如此处所示 net-tuple-and-equals-performance?
它可以可靠地用作字典键吗?
我已经运行做了个小测试:
Tuple<DateTime, string, int> test3 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);
Tuple<DateTime, string, int> test4 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);
Console.WriteLine(test3 == test4);
Console.WriteLine(test3.Equals(test4));
Console.ReadKey();
结果一假一真。我想 equals 已经实现,但运算符没有。这是否意味着 == 运算符比较引用?另外,我找不到 IEqualityComparer(框架版本 4)的重载。
谢谢。
查看 documentation,您可以看到:
GetHashCode
被覆盖,尽管没有清楚地记录细节。 (例如,对于所有实例,可能 return 0。)
Equals
以一种有据可查的方式被覆盖,委托给组件类型的相等比较器。
==
运算符 未 重载 - 所以是的,它将执行常规引用身份比较
虽然没有明确记录,但编译时组件类型必须相等,而不仅仅是执行时组件类型.例如:
var t1 = new Tuple<object, object>("foo", "bar");
var t2 = new Tuple<string, string>("foo", "bar");
Console.WriteLine(t1.Equals(t2)); // False
抱歉,如果重复。我找不到关于那件事的完整解释。 而且 MSDN 像往常一样含糊不清......
.Net 元组是否为开箱即用的 equals 和 GetHashCode 提供可用的实现? (因此 == 运算符)
我可以期望一个元组在默认情况下比较它的所有项目,还是我必须提供一个 IEqualityComparer,如此处所示 net-tuple-and-equals-performance?
它可以可靠地用作字典键吗?
我已经运行做了个小测试:
Tuple<DateTime, string, int> test3 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);
Tuple<DateTime, string, int> test4 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);
Console.WriteLine(test3 == test4);
Console.WriteLine(test3.Equals(test4));
Console.ReadKey();
结果一假一真。我想 equals 已经实现,但运算符没有。这是否意味着 == 运算符比较引用?另外,我找不到 IEqualityComparer(框架版本 4)的重载。
谢谢。
查看 documentation,您可以看到:
GetHashCode
被覆盖,尽管没有清楚地记录细节。 (例如,对于所有实例,可能 return 0。)Equals
以一种有据可查的方式被覆盖,委托给组件类型的相等比较器。==
运算符 未 重载 - 所以是的,它将执行常规引用身份比较
虽然没有明确记录,但编译时组件类型必须相等,而不仅仅是执行时组件类型.例如:
var t1 = new Tuple<object, object>("foo", "bar");
var t2 = new Tuple<string, string>("foo", "bar");
Console.WriteLine(t1.Equals(t2)); // False