c# - string.IndexOf 在 .NET 5.0 中返回不同的值

标签 c# .net-core .net-5

当我在 .NET Core 3.1 中运行以下代码时,我得到 6作为返回值。

// .NET Core 3.1
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
结果:
6
但是当我在 .NET 5.0 中运行这段代码时,我得到了不同的结果。为什么会发生这种情况?
// .NET 5.0
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
结果:
-1

最佳答案

评论和@Ray 的回答包含了原因。
虽然黑客入侵了 .csprojruntimeconfig.json文件可能会节省您的时间真正的解决方案是明确指定比较:

// this returns the expected result
int idx = s.IndexOf("\n", StringComparison.Ordinal);
出于某种原因IndexOf(string)默认使用当前区域性比较,当您的应用程序在与您的区域设置不同的环境中执行时,即使使用较早的 .NET 版本也可能会导致意外。
使用特定于文化的搜索实际上是一种非常罕见的场景(例如,可以在浏览器、图书阅读器或 UI 搜索中有效)并且它比顺序搜索慢得多。
同样的问题适用于 StartsWith/EndsWith/Contains/ToUpper/ToLower甚至 ToStringParse可格式化类型的方法(尤其是在使用浮点类型时),因为这些默认情况下也使用当前区域性,这可能是许多陷阱的来源。但是,如果您不使用特定的比较或文化,最近的代码分析器(例如 FxCop、ReSharper)会警告您。建议在产品代码中为这些问题设置高严重性。

关于c# - string.IndexOf 在 .NET 5.0 中返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64833645/

相关文章:

ssl - 如何为 dotnet core 和 nuget 使用非默认 ca 证书?

c# - 如何在 Razor Page OnInitialized 事件中使用 404 路由

c# - .net Core 3.1 Newtonsoft.Json 将dictionary<int,string> 键转为字符串

blazor-server-side - Mudblazor DatePicker 绑定(bind)仅以一种方式工作

c# - 如何删除父控件

c# - 如何在 C# 中验证数字签名的 XML 文档?

c# - 解决方案文件夹路径问题中的本地文件

c# - 如何从 backgroundworker C# 返回多个结果

c# - 使用 async/await 快速处理队列

c# - 代码适用于 .Net 5 但不适用于 .Net 6