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

相关推荐
j7~4 小时前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
小宋10214 小时前
OpenTelemetry GenAI可观测性实战:串起模型、工具、Token与错误
java·人工智能·算法·贪心算法
leisoo80974 小时前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
Lazionr4 小时前
unordered_map和unordered_set的使用
开发语言·c++·算法
m0_587383004 小时前
工业场景设备维修维护实战技巧 全流程标准化落地与常见问题排查指南
java·spring·小程序·架构·需求分析
Xiu Yan4 小时前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖4 小时前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理4 小时前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
木头科技4 小时前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
深盾科技_Virbox5 小时前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全