より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

なぜResharperはAdd StringComparison.Ordinalを提案してくるのか?

以下のようなstring.IndexOfメソッドを使った場合、ResharperはStringComparison.Ordinalの指定を推奨してきます。

            var text = "Are You Happy?";
            var index = text.IndexOf("Happy");

f:id:rimever:20191027214413p:plain

以下の説明に記載されています。

www.jetbrains.com

The canonical example is the Turkish where there is a lowercase dotless "ı" with the corresponding uppercase "I", and a lowercase "i" with an uppercase "İ" with the dot.

トルコ語では、

  • ドットなしの "ı"が小文字で、対応する大文字がI
  • ドットがついたiが小文字で、対応する大文字はドットのついた"İ"

言語によっては必ずしもiが小文字、大文字はI(エルではなくアイです)という訳ではないのです。

といったように言語ごとに異なるため、StringComparison.Ordinalの指定が推奨されています。

いちいち面倒だなと思えてきますが、GitHubなどで海外のソースを共有した時、自分のアプリが海外で動作する時などにネックになるでしょう。

docs.microsoft.com

StringComparison.Ordinalの挙動については以下で詳細がわかります。

docs.microsoft.com

スウェーデンのæという文字列はaeとStringComparison.InvariantCultureやStringComparison.CurrentCultureでは同じと判断されます。

この文字はaとeの合字だからか、言語設定がスウェーデンでも英語でもそうなります。

ただし、StringComparison.Ordinalとすると別として扱われます。

aとeの合字であれば、aeとした時も部分一致された方が検索とかは扱いやすい? うーん、考えるとややこしくなってきた・・・。