以下(不正确/危险)代码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());}输出:EvilClass(1)EvilClass(42)如您所见,调用修改 e2。如果我们在编译器中将参数标记为不允许您修改它。e1.Equals(e2)Object.Equals() 不假设要更改它的参数 - 那么为什么参数不在(输入)参数中?
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
最明显的原因是它是在 C# 7.2 中引入的,而从 .net 的第一个版本开始就已经存在了。inobject.Equals
另一个原因是它实际上不会改变任何东西。 防止改变引用,而不是实际对象。如果您尝试此操作: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);
}
}
然后输出仍将是:
EvilClass(1)
EvilClass(42)
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消