“比较”或许是最常见的字符串操作。一般因为两个原因要比较字符串:判断相等性或者排序。
判断字符串相等性或者排序时,强烈建议调用 String 类定义的以下方法之一:
排序时应该总是执行区分大小写的比较。原因是假如只是大小写不同的两个字符串被视为相等,那么每次排序都可能按不同顺序排列,用户会感到困惑。
其中 CompareOptions 定义如下:
接受 CompareOptions 实参的方法要求显式传递语言文化。
//--
许多程序都将字符串用于内部编程目的,比如路径名、文件名、URL、注册表项/值、环境变量、反射、XML标记、XML特性等。这些字符串通常只在程序内部使用,不想用户显示。出于编程目的而比较字符串时,应该总是使用 StringComparison.Ordinal 或者StringComparison.OrdinalIgnoreCase 。忽略语言文化是字符串比较最快的方式。
另一方面,要求语言文化正确的方式来比较字符串(通常是为了用户展示),就应该使用 StringComparison.CurrentCulture 或者 StringComparison.CurrentCultureIgnoreCase 。
//--
StringComparison.InvariantCulture 和 StringComparison.InvariantCultureIgnoreCase 平时最好不要用。虽然这两个值能保证比较时的语言文化正确性,但用来比较内部编程所需的字符串,所花的时间远超出序号比较。
//--
要在序号比较前更改字符串中的字符的大小写,应该使用 String 的 ToUpperInvariant 或 ToLowerInvariant 方法。强烈建议用ToUpperInvariant方法对字符串进行正规化(normalizing),而不用 ToLowerInvariant ,因为 Microsoft 对执行大写比较的代码进行了优化。事实上,执行不区分大小写的比较之前,FCL会自动将字符串正规化为大写形式。之所以要用 ToUpperInvariant 和 ToLowerInvariant 方法,是因为 String 类没有提供 ToUpperOrdinal 和 ToLowerOrdinal 方法。之所以不用 ToUpper 和 ToLower 方法,是因为它们对语言文化敏感。
//--
以语言文化正确的方式比较字符串时,有时需要指定另一种语言文化,而不是使用与调用线程关联的那一种。这时可用前面列出的 StartsWith,EndsWith 和 Compare 方法的重载版本,它们都接受 Boolean 和 CultureInfo 参数。
//--
除了前面列出的之外, String 类型还为 Equals,StartsWith,EndsWith 和 Compare 方法定义了其他几个重载版本。但是,Microsoft 建议避免使用这些额外的版本。除此之外,String 的其他比较方法---CompareTo(IComparable接口所要求实现的)、CompareOrdinal 以及 == 和 != 操作符---也应避免使用。之所以要避免使用这些方法和操作符,是因为调用者不显式指出以什么方式执行字符串比较,而你无法从方法名看出默认比较方式。例如,CompareTo 默认执行对语言文化敏感的比较,而 Equals 执行普通的序号比较。如果总是显式地指出以什么方式执行字符串比较,代码将更容易阅读和维护。