为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
LEATH 2022-08-20 15:15:28
以下(不正确/危险)代码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)


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信