IndexOfのCompareOptionsの詳しい解説 の続き

id:siokoshou:20050411のプログラムで奇妙なのは keyword = ""、buff = "" のときです*1。このとき、無限ループに入ります(無限ループはプログラムがいいかげんなのが悪いのですがw)。posにいくつを入れても、optに何を入れても例外はあがってきません。StringSortが指定できたのもこの場合です。
String.IndexOfのMSDNライブラリの説明では「IndexOf( string value )のvalueがEmptyの場合、戻り値は0です」とあります。まぁ、IndexOfに渡す前にEmptyくらいチェックするので、たいした問題はないと思っていました。
ここに1文字の「〇」(ゼロ)を入れると、ゼロの文字が無視されてEmpty扱いで戻り値が0で返ってくるようです。OMG!

Emptyじゃなく「〇」(ゼロ)文字のように無視される文字の場合はチェックが難しい…、というか何が無視される文字なのか分からないので困ったものです。セキュアなプログラミング方法として、受け付ける文字だけを決めて、それ以外をはじくのがよいとされています。反対にまずい方法は、不正なデータをチェックする方法だそうな(昨日URLを挙げたIBMdeveloperWorksより)。と文章ならさらっと書けますが、何が正しいかを決めることは大変なことです…。

ちなみにデバッガの不具合も見つけてしまいました。文字列はconstの""を与えているのに、デバッガではnullと表示されます。本当にnullを与えるとIndexOfで例外を挙げてくるので、デバッガの不具合かな?const stringに""を入れるのもなんですが。
keywordやbuffをstaticやインスタンスフィールドにして、""やString.Emptyを入れると、デバッガの表示が正しく""になりました。


今度こそ CompareOptions.None の説明。MSDNライブラリによると「文字列比較の既定のオプション設定を示します」。説明になってないような…。おそらく、CompareOptionsのNone以外の動作ではない、Ordinalでもなければ、Ignoreなんとかでもないってことだと思います。おそらく。
比較にはUnicode的な比較、IgnoreNonSpaceの説明で書いたような「ss」と「U+00DF」(エスツェット)が同一視される比較が行われます。 id:atsushieno:20050414 がとっても詳しいです。感謝します!(リンク先の Access のページの件は、CompareOptions.None ではないようです)

*1:if ( -1 != "".IndexOf( "" ) ) Console.WriteLine( "Find!)" ); を試すと解りやすい