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,字符串除外;使用 == 比较字符串确实使事情变得更简单和更易读,但你需要记住运算符的两边必须是字符串类型的表达式才能使比较正常进行。

相关推荐
余额瞒着我当琳16 分钟前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
thefool11226626 分钟前
翻转二叉树
java
坐吃山猪40 分钟前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw1 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠1 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
喜欢打篮球的普通人1 小时前
LLVM Backend Lowering 从入门到实战:把 IR 变成机器码的完整链路
android·java·数据库
FL16238631292 小时前
室内易燃物识别易燃评估室内易燃程度识别分割数据集labelme格式1015张85类别
java·服务器·前端
SL-staff2 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
jufeng13072 小时前
【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 8 篇】
java·spring boot·时序数据库·tdengine
SomeB1oody2 小时前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程