String.Compareメソッドは、CompareToメソッドと同じ動作をする静的メソッドです。 Equalsメソッドは、静的メソッドとしても用意されています。 戻り値はインスタンスメソッドの場合と同じです。
| 文字列aとbの関係 | String.Compare(a, b)の戻り値 | 例 | 
|---|---|---|
| 並べ替えたときにaの方がbよりも前 (aはbよりも小さい) | 0より小さい値 | "ABC" < "ABD" null < "ABC" | 
| 並べ替えたときにaとbは同じ位置 (aとbは等しい) | 0 | "ABC" = "ABC" null = null | 
| 並べ替えたときにaの方がbよりも後 (aはbよりも大きい) | 0より大きい値 | "ABC" > "ABB" "ABC" > null | 
String.Compare・Equalsメソッドで2つの文字列の大小関係・等価関係の比較を行う
      using System;
class Sample {
  static void Main()
  {
    var s1 = "foo";
    var s2 = "bar";
    var s3 = "baz";
    Console.WriteLine("Compare({0}, {1}) : {2}", s1, s2, String.Compare(s1, s2));
    Console.WriteLine("Compare({0}, {1}) : {2}", s1, s3, String.Compare(s1, s3));
    Console.WriteLine("Compare({0}, {1}) : {2}", s2, s3, String.Compare(s2, s3));
    Console.WriteLine("Compare({0}, {1}) : {2}", s2, s2, String.Compare(s2, s2));
    Console.WriteLine("Equals({0}, {1}) : {2}", s1, s2, String.Equals(s1, s2));
    Console.WriteLine("Equals({0}, {1}) : {2}", s1, s3, String.Equals(s1, s3));
    Console.WriteLine("Equals({0}, {1}) : {2}", s2, s3, String.Equals(s2, s3));
    Console.WriteLine("Equals({0}, {1}) : {2}", s2, s2, String.Equals(s2, s2));
  }
}
実行結果
      Compare(foo, bar) : 1 Compare(foo, baz) : 1 Compare(bar, baz) : -1 Compare(bar, bar) : 0 Equals(foo, bar) : False Equals(foo, baz) : False Equals(bar, baz) : False Equals(bar, bar) : True
インスタンスメソッドでも静的メソッドでも結果は同じですが、想定される状況により使い分けることが出来ます。 例えば、静的メソッドのCompareとEqualsを使うと、仮に文字列変数にnull/Nothingが代入されていてもヌル参照を引き起こさずに済みます。 (nullとの比較や、null同士の比較を行っても例外エラーにはなりません)
Stringクラスのインスタンスメソッド・静的メソッドの比較
         using System;
class Sample {
  static void Main()
  {
    string s1 = null;
    var s2 = "foo";
    Console.WriteLine(String.Compare(s1, s2)); // s1がnullでもエラーにはならない
    Console.WriteLine(s1.CompareTo(s2)); // s1がnullであるためNullReferenceExceptionがスローされる
  }
}
Stringクラスのインスタンスメソッド・静的メソッドの比較
         Imports System
Class Sample
  Shared Sub Main()
    Dim s1 As String = Nothing
    Dim s2 As String = "foo"
    Console.WriteLine(String.Compare(s1, s2)) ' s1がNothingでもエラーにはならない
    Console.WriteLine(s1.CompareTo(s2)) ' s1がNothingであるためNullReferenceExceptionがスローされる
  End Sub
End Class