Equals() vs Static string.Equals() Equals() 方法是 Object 类的一个方法,它用于比较两个对象是否相等。但是,如果我们想要比较两个字符串是否相等,我们可以使用 string.Equals() 静态方法。这个方法是 string 类的一个方法,它具有与 Object.Equals() 方法相同的功能,但是它专门用于比较字符串。使用 string.Equals() 方法可以更方便地比较字符串的相等性。
Equals() vs Static string.Equals() Equals() 方法是 Object 类的一个方法,它用于比较两个对象是否相等。但是,如果我们想要比较两个字符串是否相等,我们可以使用 string.Equals() 静态方法。这个方法是 string 类的一个方法,它具有与 Object.Equals() 方法相同的功能,但是它专门用于比较字符串。使用 string.Equals() 方法可以更方便地比较字符串的相等性。
阅读关于C#中字符串比较的内容时,我发现有很多种方法来比较两个字符串是否相等。
我习惯于使用C++中的==
,但我了解到如果你将一个对象与一个字符串进行比较,==
默认为引用值(或类似的操作)。
然后对于Equals()
方法,假设我有两个字符串。
string s1 = null; string s2 = "Hello";
如果我执行s1.Equals(s2);
,由于第一个字符串为空,我会得到一个null-reference exception异常。
但是如果我执行string.equals(s1,s2);
,如果其中一个值为null
,它将简单地返回false
,如果两个值都是null
,它将返回true
,因为这两个字符串都是相等的,即它们都是null
。
所以,是否总是使用string.equals()
方法没有任何理由不使用呢?
另外一个问题是,如果我在string.equals()
中将字符串的S大写,像这样String.equals()
,它仍然会运行与小写相同,但是IDE(Visual Studio 2015)会告诉我可以简化它,并将其转换为小写s。为什么会这样呢?
Equals()方法和Static string.Equals()方法都用于比较两个字符串是否相等。它们执行以下步骤:
1. 检查两个字符串是否引用同一个对象(如果是,则返回true)。它通过检查对象引用来完成(使用(object)a==(object)b进行检查)。注意,这一步还会在两个对象都为null时返回true。
2. 检查任一字符串是否为null(如果任一字符串为null,则返回false)。
3. 检查两个字符串的长度是否相等(如果长度不相等,则返回false)。
4. 如果执行到这一步,它会逐个字节比较两个字符串是否匹配(除非你在其中一个重载中指定了StringComparison类型)。注意,字节比较是通过优化的、高效的管理代码实现的,但这是一个你不需要关心的实现细节。
无论你使用哪个方法(如果你确定实例不为null),都可以。它们基本上做相同的事情,并且性能相同。
如果你调用一个null实例的实例方法,就会抛出NullReferenceException异常。然而,实例是否为null对于你的规范可能非常重要,你可能希望在比较之前检查null并相应地采取行动(使用string.Equals将隐藏这一点,可能更容易出错)。如果对于你的规范而言不重要,那么使用其中一个方法只是一个设计决策。
如果你感兴趣,操作符“==”对于两个字符串类型的实现如下:
public static bool operator == (String a, String b) {
return String.Equals(a, b);
}
因此,a == b和string.Equals(a,b)是相同的。
至于String和string,前者是System.String(需要在顶部使用using System;或指定完整的System.String.Equals),而后者是一个内置的别名(不需要在顶部使用using System;)。你可以使用任一种方式,它们的行为完全相同。
Equals() vs Static string.Equals()
在使用C#编程的过程中,我们经常需要比较字符串的值是否相同。对于这个需求,我们可以使用Equals()方法或者静态的string.Equals()方法。然而,在使用这两种方法时,我们可能会遇到一些问题。
根据MSDN的说明,string.Equals()方法用于判断两个字符串对象的值是否相同,如果相同则返回true,否则返回false。这就是为什么在某些情况下,使用string.equals(s1, s2)方法始终返回false的原因。只有当s1和s2都为null或者具有相同的值时,才会返回true。
另外一个问题是,如果我们在string.equals()中将字符串的首字母改为大写,即String.equals(),它仍然会以相同的方式运行,但是IDE(如Visual Studio 2015)会提示我们可以简化它,并将它转换为小写的s。为什么会这样呢?
原因在于,string是C#的原始类型,而System.String或者简单的String是对应的FCL(Framework Class Library)类型。这就像int和Int32一样,int是C#的原始类型,而Int32是对应的FCL类型。
所以,使用string.equals(s1, s2)方法时,在某些情况下始终返回false,只有当s1和s2都为null或者具有相同的值时,才会返回true。而使用String.equals(s1, s2)方法时,在相同的情况下则返回false。
实际上,string并不是C#中的原始类型。
为了解决这个问题,我们可以使用string.Equals()方法来比较字符串的值是否相同。同时,需要注意string和String之间的区别,以及它们对应的方法的不同行为。