总是觉得自己已经很小心了,没想到前两天被发现了线上的大bug,因为判断相等失效导致逻辑混乱数据库里面记录了很多脏数据,大概意思是下面的逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class A { public string Name { get; set; }
public bool Equals(A a) { return Name == a.Name; } }
class Program { public static bool Test<T>(T a, T b) { return a.Equals(b); }
static void Main(string[] args) { var a = new A {Name = "xyz"}; var b = new A {Name = "xyz"};
Console.WriteLine(Test(a, b)); } }
|
希望输出的是true,可惜输出的是false。致命错误是没有去重载object上面定义好的默认Equals函数,这个例子里面UT没有测出来问题因为如果是直接作比较是没有问题的,但是在泛型函数里面绕了一下因为这个泛型类T并没有写约束,实际上调用的Equals是object的default Equals只是比较reference equals的。
以后切记这些基础Equals, GetHashCode, ToString 要用override保证做了正确的重载