C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

依存する

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■103726 / inTopicNo.1)  依存する
  
□投稿者/ kiku (475回)-(2025/06/09(Mon) 10:30:38)

分類:[.NET 全般] 


環境
 .NET8
 WPF
 海外のPC(詳細は不明)
 Windows11

下記命令の返値が期待値と違う現象が発生しています。
 fileName.LastIndexOf("_")
原因を調べると、カルチャ依存しているため、
期待値と違う結果となっていることがわかりました。
この状況を開発PCでも発生させたいのですが、
OSのどの設定が依存しているかについて知見のある方、教えて欲しいです。

現在のところ、下記をいろいろと変更しているのですが、再現しない状態です。
 ・Windowsの表示言語
 ・国または地域

引用返信 編集キー/
■103727 / inTopicNo.2)  Re[1]: 依存する
□投稿者/ kiku (476回)-(2025/06/09(Mon) 11:15:21)
No103726 (kiku さん) に返信
> 現在のところ、下記をいろいろと変更しているのですが、再現しない状態です。
>  ・Windowsの表示言語
>  ・国または地域

どうやら下記に依存するようです。
 時刻と言語 → 管理用の言語の設定 → システムロケール
引用返信 編集キー/
■103728 / inTopicNo.3)  Re[2]: 依存する
□投稿者/ 魔界の仮面弁士 (3853回)-(2025/06/09(Mon) 11:37:31)
No103727 (kiku さん) に返信
>>現在のところ、下記をいろいろと変更しているのですが、再現しない状態です。
>> ・Windowsの表示言語
>> ・国または地域
> どうやら下記に依存するようです。
>  時刻と言語 → 管理用の言語の設定 → システムロケール

システムロケールを変更せずに検証する場合は、意図的に現在のスレッドのカルチャを変更するという手もあります。
https://learn.microsoft.com/ja-jp/dotnet/fundamentals/runtime-libraries/system-globalization-cultureinfo-currentculture


もしもカルチャー非依存であることを求める場合、StringComparison 引数付きのオーバーロードを呼ぶ形に改修すべきでしょうね。
特にライブラリ開発者は、StringComparison.Ordinal あるいは (OrdinalIgnoreCase)を呼ぶことが
互換性およびパフォーマンスの点で望ましいとされるようです。

もし、StringComparison 引数無しの IndexOfメソッドが呼び出されたときには
 String を検索する場合は StringComparison.CurrentCulture 指定
 Char を検索する場合は StringComparison.Ordinal 指定
に相当する動作となります。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings#choosing-a-stringcomparison-member-for-your-method-call
https://note.dokeep.jp/post/csharp-globalization-icu/
引用返信 編集キー/
■103729 / inTopicNo.4)  Re[3]: 依存する
□投稿者/ kiku (477回)-(2025/06/09(Mon) 11:46:13)
No103728 (魔界の仮面弁士 さん) に返信
> ■No103727 (kiku さん) に返信
> システムロケールを変更せずに検証する場合は、意図的に現在のスレッドのカルチャを変更するという手もあります。
> https://learn.microsoft.com/ja-jp/dotnet/fundamentals/runtime-libraries/system-globalization-cultureinfo-currentculture
確認しました。

> もしもカルチャー非依存であることを求める場合、StringComparison 引数付きのオーバーロードを呼ぶ形に改修すべきでしょうね。
> 特にライブラリ開発者は、StringComparison.Ordinal あるいは (OrdinalIgnoreCase)を呼ぶことが
> 互換性およびパフォーマンスの点で望ましいとされるようです。
OrdinalIgnoreCaseで対応できることを確認しました。

> もし、StringComparison 引数無しの IndexOfメソッドが呼び出されたときには
>  String を検索する場合は StringComparison.CurrentCulture 指定
>  Char を検索する場合は StringComparison.Ordinal 指定
> に相当する動作となります。
> https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings#choosing-a-stringcomparison-member-for-your-method-call
> https://note.dokeep.jp/post/csharp-globalization-icu/
なるほど、情報ありがとうございます。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ