比较字符串相等

  Equals() 和运算符 ==

  C# 中有两种不同的相等:引用相等和值相等。值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有值相等性。引用相等意味着要比较的不是两个对象,而是两个对象引用,且两者引用的是同一个对象。这可以通过简单的赋值来实现,如下面的示例所示:

  System.Object a = new System.Object();

  System.Object b = a;

  System.Object.ReferenceEquals(a, b); //returns true

  在上面的代码中,只存在一个对象,但存在对该对象的多个引用:a 和 b。由于它们引用的是同一个对象,因此具有引用相等性。如果两个对象具有引用相等性,则它们也具有值相等性,但是值相等性不能保证引用相等性。

 

  若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals。

 

  运算符 ==

  对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回false。对于string以外的引用类型,如果两个操作数引用同一个对象,则==返回true。对于string类型,==比较字符串的值

  对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:

  int x = 100;

  Double y = 100;

  if (x == y)

  Response.Write("x==y!"); //x==y

 

  而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。

 

例如:

  Struct Userstruct1;

  Userstruct1 a;

  Userstruct1 b;

  If(a == b)

  Console.WriteLine(“can == reach this far?”)

  上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。

  对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。

  Equals():

  Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。

  StringBuilder a = new StringBuilder();

  a.Append("the test a");

  String s1 = a.ToString();

  String s2 = "the test a";

  if (s2 == s1) //为真,因为S2,S1内容相等。String类的==与Equals的行为相同,判断两个字符串的内容是否相等

  Response.Write("== returns true");

  if (Object.Equals(s2, s1)) //为真,String类重载了Equals,用于判断两个字符串的内容是否相等

  {

  Response.Write("equals returns true");

  }

  if (Object.ReferenceEquals(s2, s1)) //为假,因为s2,s1并不是指向同一个对象

  {

  Response.Write("ReferenceEquals returns true");

  }

  注:对于String类,直接声明s1 = “the test a”的话,输出结果将包含 "ReferenceEquals returns true",因为默认的,String对于声明的相同的字符串在堆上只保留一个Copy,所以s1与s2将会指向相同的Reference。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值