【问题标题】:Unexpected String.Compare() result in .NET 5 [duplicate]意外的 String.Compare() 导致 .NET 5 [重复]
【发布时间】:2021-04-20 15:13:16
【问题描述】:

我要解决的问题是为一个公共库添加多个目标框架(之前的 NET45 和新的 NETSTANDARD2.0)。该库包含许多用于对字符串进行排序的实用程序类。我想找到使 .NET 5.0 应用程序具有与以前相同的排序结果的最佳方法。我想找出最好的方法。

这是一个例子。

比较 .- 将在 .NET Frameworks 4 和 .NET 5 中返回不同的顺序。这是一个重大更改。

两个运行时的结果是:

using System;
using System.Globalization;
                    
public class Program
{
    public static void Main()
    {       
        // returns -1 in NET47 but returns 1 in NET5_0
        Console.WriteLine(string.Compare(".", "_", StringComparison.InvariantCulture));
        Console.WriteLine(string.Compare(".", "_", StringComparison.CurrentCulture));       
        var cultureInfo = new CultureInfo("en-US", false);
        Console.WriteLine(string.Compare(".", "_", true, cultureInfo));             
    }
}

【问题讨论】:

  • 文档是here;原因是 unicode 很复杂,而 .NET 5 现在使用 ICU(而不是 NLS)更正确,即使这意味着对某些结果进行更改
  • 其他链接:breaking change(和full description)和more
  • 真正的问题是什么?您的标题说明了原因,但为什么的答案对任何人都没有帮助。您是否有在两个框架中都运行的代码,而那是真正的问题?
  • 如果您的代码不再运行,您可以随时通过在项目中将 System.Globalization.UseNls 设置为 true 来切换回旧行为。
  • 或者使用Ordinal,也更快。 实际问题是什么?请记住,即使在 .NET Core 3 中,代码也会在不同平台上产生不同的结果,这实际上是更糟糕。使用 .NET (Core) 5,相同的代码在任何地方都会表现出相同的行为。

标签: c# .net .net-core .net-5 .net-standard-2.0


【解决方案1】:

NLS 确定 .NET 是使用本地语言支持 (NLS) 还是国际组件用于 Unicode (ICU) 全球化 API 用于 Windows 应用程序。 .NET 5.0 及更高版本在 Windows 2019 年 5 月 10 日更新及更高版本上默认使用 ICU 全球化 API。

  • 如果省略此设置,.NET 默认使用 ICU 全球化 API。这相当于将值设置为 false。
                      Setting name                        Values
runtimeconfig.json    System.Globalization.UseNls         false - Use ICU globalization
                                                          true - Use NLS globalization
Environment variable  DOTNET_SYSTEM_GLOBALIZATION_USENLS  false - Use ICU globalization
                                                          true - Use NLS globalization

Source

【讨论】:

  • 或使用Ordinal。 OP 没有解释问题是什么,所以不能说最好的选择是什么。
  • @PanagiotisKanavos 虽然 OP 没有解释他面临的真正问题(我 100% 同意你的观点),但对于发现此问题的未来用户了解这些设置也很重要。
  • 我完全理解 OP 所问的问题:“比较 . 和 - 将在 .NET Frameworks 4 和 .NET 5 中返回不同的顺序。”
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多