在c#中读取字符串比较我发现了很多方法来比较2个字符串,看它们是否相等。
我习惯于来自c ++的==
,但我了解到如果你将一个对象与一个字符串进行比较,那么==
默认为引用值(或类似的东西)。
然后对于Equals()
方法,我可以说我有2个字符串。
string s1 = null;
string s2 = "Hello";
如果我s1.Equals(s2);
我得到 null-reference异常导致第一个字符串为null
但如果我这样做
string.equals(s1,s2);
如果其中一个值为false
,则只会返回null
,如果两个值均为null
,则会返回true
,因为两个字符串都相等它们都是null
。
所以有任何理由不总是使用string.equals()
方法。
另外一件事是,如果我在字符串中输入带有大写字母S的string.equals()
,就像这个 S tring.equals()
那么它仍然会像我小写一样运行但是IDE(visual studio 2015)会告诉我它可以简化,当我简化它时它会把它变成小写的。那是为什么?
答案 0 :(得分:2)
根据MSDN,string.Equals
方法
确定两个String对象是否具有相同的值。
这就是string.equals(s1,s2);
在您的情况下总是返回false的原因,如果s1
和s2
都为null或具有相同的值将返回true。
另外一件事是,如果我用a键入string.equals() 字符串中的大写字母S就像这个String.equals()那样它仍然会 运行相同,如果我有它的小写但IDE(视觉工作室 2015)会告诉我它可以简化,当我简化它 把它变成小写的。那是为什么?
string
是C#原语,而System.String
或简单String
是相应的FCL(框架类库)类型。它与int
和Int32
相同,其中int
是C#原语,Int32
是相应的FLC类型。
答案 1 :(得分:2)
两种方法都执行以下步骤:
true
)。他们通过检查对象引用来执行此操作(通过检查(object)a==(object)b
来执行此操作:两个==
变量上的object
运算符仅检查参考)。请注意,如果两个对象都是true
,则此步骤也会返回null
。null
(如果有的话,请返回false
)false
StringComparison
的类型)(旁注:字节比较实现得相当即使管理不安全的代码也很好,但这是一个你不应该关心的实现细节。您是否使用其中一个(如果您确定您的实例不是null
)取决于您。两者基本上都是一样的,它们同样具有高性能。
实施链接:instance Equals method和 static string.Equals
您无法在null
个实例上调用实例方法,这就是它为您抛出NullReferenceException
的原因...但是您的实例为{{1}的事实 可能 很重要(取决于您的规格),您可能需要在比较前检查null
并采取相应措施(使用null
将它隐藏起来,可能更容易出错)。如果它对您的规格不重要,那么使用其中一个只是一个设计决定。
如果您感兴趣,两个字符串类型的运算符string.Equals
实现为(source link):
==
这样做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
)。您可以使用其中任何一种,它们的行为完全相同