.NET の文字列比較はたいへんだな
.NET での文字列の比較に関するベスト プラクティス | Microsoft Docs
String .Compare メソッドと String.CompareTo メソッドは、文字列を並べ替える場合に使用し、文字列の等価性を確認する場合には使用しません
なんやて…マジかよ
2 つの文字列が等価かどうかをテストするには、String.Equals メソッドのオーバーロードを使用します。
Nothing でも落ちないから String.Compare 多用してたわ。Equals を使えだと?
今まで、英語の大文字・小文字を区別しない比較は String.Compare( ~, ~, CurrentCultureIgnoreCase ) とかを使ってた。根拠は 「雰囲気」
InvariantCultureIgnoreCase インバリアント カルチャを使用して、大文字と小文字を区別しない比較を実行します。
インバリアントカルチャとはなんぞやと思って検索してみた。
- CurrentCulture
- 現在のカルチャに基づいた比較
- 日本語圏では、読みの順になるため「亜」<「井」
- 英語圏では、コードポイント順になるため「井」<「亜」
- InvariantCulture
- 特定の文化圏や言語に依存しないインバリアントカルチャに基づいた比較
- 日本語圏でも英語圏でも「井」<「亜」
なるほど
.NET での文字列の比較に関するベスト プラクティス | Microsoft Docs
パフォーマンスを向上させるには、StringComparison.Ordinal または StringComparison.OrdinalIgnoreCase による比較を使用します。
関連ページを一通りみたところ、static method の
public static bool Equals (string? a, string? b);
public static bool Equals (string? a, string? b, StringComparison comparisonType);
を使うのが正解のようだ。英大文字・小文字の区別をしない時は後者の第3引数に StringComparison.OrdinalIgnoreCase を与えればよいということかな
ところで
public static bool Equals (string? a, string? b);
string?
って Nullable<string> だと思うんだけど、なんで Nullable なんだろ。string は structure ではなく class なので null (Nothing) は大丈夫だと思うんだが…
これはユーザに「NULLでも大丈夫」だと明示するために、わざとそう書いているだけだろうか…
ttps://twitter.com/kariya_mitsuru/status/1387999438577172485
勘ついでに、String? は C#8 で導入された null 許容参照型への対応とかじゃないですかね?(勘ついでとは…
あー、なるほど。null が来たら、コンパイラレベルで警告を出せるようになったと。だからわざわざ Nullable で宣言が必要になったわけかー
奥が深い(便利だ)
Java の話ですけど,久しぶりに仕事で Java を書いてて「null 文字列」がありうることをすっかり忘れてたために意図しないところでヌルポになってしまい,思い出すまでひとしきり悩んでました。
Go だと文字列は(ポインタで明示的に渡さない限り)値なので「null 文字列」とか気にしなくてよかったので油断してましたw