为什么String.Equals(Objectobj)检查this==null?可能重复:为什么要检查这个!=空?//判断两个字符串是否匹配。[ReliabilityContract(Consistency.WillNotCorruptState,Cer.MayFail)]publicoverrideboolEquals(Objectobj){//这是防止反向调用和//其他不使用callvirt指令的调用者所必需的if(this==null)抛出新的NullReferenceException();字符串str=obj作为字符串;如果(str==null)返回false;如果(Object.ReferenceEquals(this,obj))返回真;返回EqualsHelper(this,str);我不明白的部分是它正在检查当前实例,而不是null。评论有点混乱,所以我想知道这个评论到底是什么意思?任何人都可以举例说明如果该检查不存在这可能会如何中断,这是否意味着我也应该将检查放在我的班级中?此检查用于防止本机代码可以使用空this指针调用该函数。这在C#中不会发生,因此您不必在代码中添加类似的守卫。String类很可能是在C#最终确定之前编写的,作者可能认为防止空值很重要,或者通常从本机代码和其他地方调用String方法可以很容易地调用null上的方法。请注意,即使您确实设法使用null进行调用,并且您没有守卫,所发生的只是异常会略有不同。它可能是一个不同的异常,它可能被另一个成员抛出,但除此之外它不太可能产生影响。换句话说,如果没有空检查,EqualsHelper(或其中之一是EqualsHelper)将抛出异常而不是Equals。由于需要从用户的角度隐藏函数的内部结构,因此将检查放在开头是有意义的。添加的null检查不仅适用于后来的语言,它还有助于调试实际可能抛出错误(调用null对象的实例方法)的位置。如果它不存在,你可以调用类中的任何方法而不会出现任何错误,只要它永远不会取消引用(访问成员变量)。到目前为止,这对你的空对象有效,几个方法调用确实有效,然后突然你得到一个空引用异常(访问实例数据的方法)。如果您查看.NET类中的检查,很明显只有少数突出的类(如String)包含此类守卫。IndexOf等其他方法无法防止这种情况。这是不一致的,但我认为这种双重空值检查的性能损失不值得,因为BCL的大多数用户都是使用callvirt指令的语言,而第二次空值检查没有帮助。以上就是C#学习教程:String.Equals(Objectobj)为什么要检查this==null?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
