以下(不正確/危險)代碼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)如您所見,調(diào)用修改 e2。如果我們在編譯器中將參數(shù)標(biāo)記為不允許您修改它。e1.Equals(e2)Object.Equals() 不假設(shè)要更改它的參數(shù) - 那么為什么參數(shù)不在(輸入)參數(shù)中?
1 回答

瀟瀟雨雨
TA貢獻1833條經(jīng)驗 獲得超4個贊
最明顯的原因是它是在 C# 7.2 中引入的,而從 .net 的第一個版本開始就已經(jīng)存在了。inobject.Equals
另一個原因是它實際上不會改變?nèi)魏螙|西。 防止改變引用,而不是實際對象。如果您嘗試此操作: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 關(guān)注
- 122 瀏覽
添加回答
舉報
0/150
提交
取消