遵循(不正确/危险)代码
class EvilClass
{
protected int x;
public EvilClass(int x)
{
this.x = x;
}
public override bool Equals(Object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
EvilClass p = (EvilClass)obj;
p.x = 42;
return (x == p.x);
}
}
public override int GetHashCode()
{
return (x << 2);
}
public override string ToString()
{
return String.Format("EvilClass({0})", x);
}
}
void Main()
{
var e1 = new EvilClass(1);
var e2 = new EvilClass(2);
var equals = e1.Equals(e2);
Console.WriteLine("{0}", e1.ToString());
Console.WriteLine("{0}", e2.ToString());
}
Run Code Online (Sandbox Code Playgroud)
输出:
EvilClass(1)
EvilClass(42)
Run Code Online (Sandbox Code Playgroud)
如您所见,调用e1.Equals(e2)修改e2.如果我们在编译器中标记参数将不允许我们修改它.
的Object.Equals()不要以为改变它的参数-那么,为什么参数不中(输入)参数?
最明显的原因是它in是在C#7.2中引入的,而object.Equals自从.net的第一个版本开始就存在.
另一个原因是它实际上不会改变任何东西.in防止改变引用,而不是实际对象.如果你试试这个:
public bool Equals2(in Object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
EvilClass p = (EvilClass)obj;
p.x = 42;
return (x == p.x);
}
}
Run Code Online (Sandbox Code Playgroud)
然后输出仍然是:
EvilClass(1)
EvilClass(42)
Run Code Online (Sandbox Code Playgroud)