C# Equals()方法报错:NullReferenceException was unhandled

下面是一个C# Equals()方法的例子,执行时报错了

cs 复制代码
static void Main(string[] args)
{
    string name = "sandeep";
    string myName = null;
    Console.WriteLine("== operator result is {0}", name == myName);
    Console.WriteLine("Equals method result is {0}", myName.Equals(name));
    Console.ReadKey();
}

报错信息为:

NullReferenceException was unhandled

Object reference not set to an instance object.

Equals报错:NullReferenceException was unhandled

意思是空引用异常未处理;对象引用没有设置为对象实例。

我们该如何分析其原因呢?这就需要理解一下== 运算符和 Equals() 方法的区别了。

== 运算符和 Equals() 方法都用于比较两个值类型数据项或引用类型数据项。相等运算符 (==) 是比较运算符,Equals() 方法比较字符串的内容。== 运算符比较引用标识,而 Equals() 方法只比较内容。让我们看一些例子。

在下面示例中,我们将一个字符串变量分配给另一个变量。字符串是引用类型,在示例中,一个字符串变量被分配给另一个字符串变量,因此它们在堆中引用相同的标识,并且两者具有相同的内容,因此你可以获得==运算符和Equals()方法的 True 输出。

cpp 复制代码
using System;

namespace ComparisionExample
{
   class Program
    {
      static void Main(string[] args)
       {
          string name = "sandeep";
          string myName = name;
          Console.WriteLine("== operator result is {0}", name == myName);
          Console.WriteLine("Equals method result is {0}", name.Equals(myName));
          Console.ReadKey();
        }

    }
}

现在运行程序,得到如图1.1所示的结果

图1.1 第一个程序的输出

让我们看另一个例子,其中两个对象变量的内容相同,但都有不同的引用。因此 == 运算符返回 false ,因为它比较引用标识,而 Equals() 方法返回 true,因为它比较对象的内容。

cs 复制代码
using System;
namespace ComparisionExample
{
   class Program
    {
       static void Main(string[] args)
        {
           object name = "sandeep";
           char[] values = {'s','a','n','d','e','e','p'};
           object myName = new string(values);
           Console.WriteLine("== operator result is {0}", name == myName);
           Console.WriteLine("Equals method result is {0}", myName.Equals(name));
           Console.ReadKey();
        }
    }
}

现在运行程序,得到如图1.2 所示的结果。

图 1.2 程序 2 的输出

现在让我们再回头看文章开头的出错例子,该例子表明当你将空值分配给字符串变量并使用该变量时,Equals() 方法是字符串类的扩展方法,然后 Equals() 方法获得空引用的异常,因此在调用 Equals() 方法时,你必须确保你的变量没有空值。当你的一个变量包含空值时,你应该将该变量用作 Equals() 方法的参数。

图 1.3 空引用异常

经验法则是,对于几乎所有引用类型,当你想要测试相等性而不是引用标识时,请使用 Equals,字符串除外;使用 == 比较字符串确实使事情变得更简单和更易读,但你需要记住运算符的两边必须是字符串类型的表达式才能使比较正常进行。

相关推荐
宇木灵8 小时前
C语言基础学习-二、运算符
c语言·开发语言·学习
无心水8 小时前
【任务调度:数据库锁 + 线程池实战】3、 从 SELECT 到 UPDATE:深入理解 SKIP LOCKED 的锁机制与隔离级别
java·分布式·科技·spring·架构
yangSimaticTech9 小时前
沿触发的4个问题
开发语言·制造
编程小白gogogo9 小时前
苍穹外卖图片不显示解决教程
java·spring boot
舟舟亢亢9 小时前
算法总结——二叉树【hot100】(上)
java·开发语言·算法
百锦再9 小时前
Java中的char、String、StringBuilder与StringBuffer 深度详解
java·开发语言·python·struts·kafka·tomcat·maven
普通网友10 小时前
多协议网络库设计
开发语言·c++·算法
努力努力再努力wz10 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
daxi15010 小时前
C语言从入门到进阶——第9讲:函数递归
c语言·开发语言·c++·算法·蓝桥杯
勇气要爆发11 小时前
LangGraph 实战:10分钟打造带“人工审批”的智能体流水线 (Python + LangChain)
开发语言·python·langchain