当前位置: 首页 > article >正文

windows C#-相等比较

有时需要比较两个值是否相等。 在某些情况下,测试的是“值相等性”,也称为“等效性”,这意味着两个变量包含的值相等。 在其他情况下,必须确定两个变量是否引用内存中的同一基础对象。 此类型的相等性称为“引用相等性”或“标识”。 

引用相等性

引用相等性指两个对象引用均引用同一基础对象。 这可以通过简单的赋值来实现,如下面的示例所示。

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);
    }
}

在此代码中,创建了两个对象,但在赋值语句后,这两个引用所引用的是同一对象。 因此,它们具有引用相等性。 使用 ReferenceEquals 方法确定两个引用是否引用同一对象。

引用相等性的概念仅适用于引用类型。 由于在将值类型的实例赋给变量时将产生值的副本,因此值类型对象无法具有引用相等性。 因此,永远不会有两个未装箱结构引用内存中的同一位置。 此外,如果使用 ReferenceEquals 比较两个值类型,结果将始终为 false,即使对象中包含的值都相同也是如此。 这是因为会将每个变量装箱到单独的对象实例中。 

值相等性

值相等性指两个对象包含相同的一个或多个值。 对于基元值类型(例如 int 或 bool),针对值相等性的测试简单明了。 可以使用 == 运算符,如下面的示例所示。

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}

对于大多数其他类型,针对值相等性的测试较为复杂,因为它需要用户了解类型对值相等性的定义方式。 对于具有多个字段或属性的类和结构,值相等性的定义通常指所有字段或属性都具有相同的值。 例如,如果 pointA.X 等于 pointB.X,并且 pointA.Y 等于 pointB.Y,则可以将两个 Point 对象定义为相等。 对记录来说,值相等性是指如果记录类型的两个变量类型相匹配,且所有属性和字段值都一致,那么记录类型的两个变量是相等的。

但是,并不要求类型中的所有字段均相等。 只需子集相等即可。 比较不具所有权的类型时,应确保明确了解相等性对于该类型是如何定义的。 若要详细了解如何在自己的类和结构中定义值相等性,请参阅如何为类型定义值相等性。

浮点值的值相等性

由于二进制计算机上的浮点算法不精确,因此浮点值(double 和 float)的相等比较会出现问题。


http://www.kler.cn/a/418332.html

相关文章:

  • Zephyr 入门-设备树与设备驱动模型
  • Mysql数据库基础篇笔记
  • 在 Flutter app 中,通过视频 URL 下载视频到手机相册
  • [免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】
  • 排序算法之选择排序堆排序
  • C++:异常
  • 《windows堆内存剖析(一)》
  • ChromeBook11 HP G7EE 刷入Ubuntu的记录
  • 鲲鹏麒麟安装离线版MySQL5.7
  • 吉客云数据集成技巧:智能实现MySQL物料信息查询
  • 栈-数组描述(C++)
  • mysql查询语句执行全流程
  • 10x 性能提升,ProtonBase 为教育行业提供统一的数据库和数仓体验
  • 【C#设计模式(16)——解释器模式(Interpreter Pattern)】
  • 搭建业务的性能优化指南
  • [C/C++]排序算法1、冒泡排序
  • 汽车座舱系统名词
  • 【开源免费】基于Vue和SpringBoot的校园资料分享平台(附论文)
  • 七牛智能CDN视频优化方案,展现企业长期价值
  • android shader gl_Position是几个分量
  • 【竞技宝】CS2-上海major:MongoLZ成为亚洲之光
  • C# 中的事件:对象间通信的利器
  • macos下brew安装redis
  • 每日十题八股-2024年11月30日
  • 依托 SpringBoot 的新冠密接者跟踪系统:技术创新驱动疫情防控效能提升
  • wordpress仿社交软件SOUL 动态标签星球- 为你的博客注入灵魂