默认为实习 . 这意味着只有一个给定字符串的实例 . 以下代码导致只创建一个字符串: a , b 和 c 都指向字符串 quick 的完全相同的实例 . 这意味着 Object.ReferenceEquals() 在比较任何两个时都是正确的:
string a = "The quick brown dog...".Substring(4,5) ;
string b = new string(new char[]{'q','u','i','c','k'});
string c = new StringBuilder().
.Append('q')
.Append('u')
.Append('i')
.Append('c')
.Append('k')
.ToString()
;
string s = "A";
s.Equals("a", StringComparison.InvariantCultureIgnoreCase); // Will return true.
string s = "A";
s.Equals("a", StringComparison.InvariantCulture); // Will return false.
public static class StringExtensions
{
public static int CaseInsensitveCompare(this string s, string stringToCompare)
{
return String.Compare(s, stringToCompare, StringComparison.InvariantCultureIgnoreCase);
}
}
电话:
int result = firstString.CaseInsensitveCompare(secondString);
3 回答
它不会表现得“完全像一个字符串” .
string
类型是特殊的,并且被烘焙到语言规范中 . C#字符串表现出特殊的行为,例如是一个引用类型,它通过值传递 . 引用类型通常由...... well ...引用传递 .
默认为实习 . 这意味着只有一个给定字符串的实例 . 以下代码导致只创建一个字符串:
a
,b
和c
都指向字符串quick
的完全相同的实例 . 这意味着Object.ReferenceEquals()
在比较任何两个时都是正确的:[ edited to note: 虽然有人可能会认为这应该是可能的,但有点摆弄表明实际上无法创建
CompareInfo
的自定义实现/子类型,因为它没有公共构造函数且其默认构造函数是internal
. 更多关于这个问题的答案:Globally set String.Compare/ CompareInfo.Compare to Ordinal哎呀...]
你 could do 是这样的:
字符串比较使用当前文化的校对/比较规则完成 . 为您的应用创建自定义文化,例如,使用您需要的排序/比较规则的美国文化副本 . 把它当作当前的文化和鲍勃的叔叔 .
你仍然会得到编译器/ ReSharper唠叨,因为你正在进行字符串比较而没有指定所需的比较语义,但你的代码将是干净的 .
有关详细信息,请参阅
https://msdn.microsoft.com/en-us/library/kzwcbskc(v=vs.90).aspx
https://msdn.microsoft.com/en-us/library/se513yha(v=vs.100).aspx
比较字符串相当容易 . 您只需使用equals方法或compare方法即可 .
例:
你也应该看this . 这将更多地解释比较字符串 .
基于deathismyfriend上面的答案类型,我会扩展字符串类:
电话: