为什么 Object.Equals 的参数不是“in”(输入)?

以下(不正确/危险)代码


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() 不假设要更改它的参数 - 那么为什么参数不在(输入)参数中?


LEATH
浏览 99回答 1
1回答

潇潇雨雨

最明显的原因是它是在 C# 7.2 中引入的,而从 .net 的第一个版本开始就已经存在了。inobject.Equals另一个原因是它实际上不会改变任何东西。 防止改变引用,而不是实际对象。如果您尝试此操作:inpublic bool Equals2(in Object obj){&nbsp; &nbsp; if ((obj == null) || !this.GetType().Equals(obj.GetType()))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; EvilClass p = (EvilClass)obj;&nbsp; &nbsp; &nbsp; &nbsp; p.x = 42;&nbsp; &nbsp; &nbsp; &nbsp; return (x == p.x);&nbsp; &nbsp; }}然后输出仍将是:EvilClass(1)EvilClass(42)
打开App,查看更多内容
随时随地看视频慕课网APP