String == Equal

本文探讨了C#中String类型使用==操作符时的行为特性。解释了尽管String是引用类型,但在进行==比较时,.NET框架实际上调用了Equals方法来确保即使两个String实例的引用不同,只要它们的内容相同也会返回true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


OBJECT作参数时是传址的(就是你说的传引用)

String虽然是引用类型,但是当参数使用时你要当作是传值,不是传址,就对了。

其它基本类型都是传值的

我一直想当然的认为 两个String 类型如果用 == 操作符比较,将比较其引用。所以如果两个String引用不同,则只能使用Equal 来比较它们是否相等。

     比如下面语句

            string s2 = new StringBuilder().Append("My").Append("Test").ToString();
            
string s3 = new StringBuilder().Append("My").Append("Test").ToString();

 

     如下方法比较其引用

     Console.WriteLine((object)s3 == (object)s2);

     得到结果为 false,即s2, s3指向不同引用。

     那么我想当然的认为  Console.WriteLine(s3 == s2); 的结果也是false,因为string 是引用类型,用==操作符比较引用类型变量,如果两个变量的引用不同,即便值相同,也会返回false. 然而运行的结果让我大跌眼镜。返回的值是true.

     于是在网上狂搜,最后终于找到了原因。

     String 的等号操作符的处理是特殊的,其源码如下

=== Equality operator on string type (C#) ===

// The == operator overload MSIL:
.method public hidebysig specialname static bool
    op_Equality(
string a, string b) cil managed
ExpandedBlockStart.gifContractedBlock.gif
{
    .maxstack 
8
    L_0000: ldarg.
0
    L_0001: ldarg.
1
    L_0002: call 
bool System.String::Equals(
        
stringstring)
    L_0007: ret
}

 

 从这段源码中我们看到.net 在字符串等号操作符中调用了 System.String::Equals 这个静态方法来比较。这个静态方法的代码如下。


        
// Determines whether two Strings match. 

ExpandedBlockStart.gifContractedBlock.gif        
public static bool Equals(String a, String b) {

ExpandedSubBlockStart.gifContractedSubBlock.gif            
if ((Object)a==(Object)b) 

                
return true

            }


 

ExpandedSubBlockStart.gifContractedSubBlock.gif            
if ((Object)a==null || (Object)b==null{

                
return false;

            }


 

            
return EqualsHelper(a, b);

        }

 

从这个代码我们可以看出两个string 类型在进行==操作符比较时先比较引用是否相等,如果不等会调用EqualsHelper比较值是否相等。这也就是我们看到用==操作符比较两个引用不同但值相同的string时得到true的原因。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值