0%

记一个判断相等的bug

总是觉得自己已经很小心了,没想到前两天被发现了线上的大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保证做了正确的重载