.net LTS3.1升5.0和LTS6.0隐蔽的坑

下面这段代码就是把ascll为0到127值 ,转成string,并判断在字符串中的位置,第5,6行代码分别用了两种IndexOf方法的重载。

for (var i = 0; i < 128; i++)
{
    var str1 = ((char)i).ToString();
    var str2 = $"---------------{str1}---------------";
    var no1 = str2.IndexOf(str1);
    var no2 = str2.IndexOf(str1, System.StringComparison.Ordinal);


    if (no1 != no2)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine($"不等  i={i},str1={str1},no1={no1},no2={no2}");
    }
    else
    {
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine($"相等  i={i},str1={str1},no1={no1},no2={no2}");
    }
    Console.ResetColor();
}

结果如下,相等为绿色,不等为红色,并且在win10下的结果。

.net core 3.1下的结果,一片绿光。

.net 6.0下的结果,红色一片

代码不动,为什么会出现这样的差异呢?

这是因为在windows上,.net早期版本(.net core 1.0-3.1)是用NLS(国家语言支持或区域语言支持)来实现全球化的功能和字符串的一些处理功能,但在.net5.0后,windows 10 19年5月10日的更新中,带了icu.dll(ICU:Unicode国际组件)作为系统的一部分,所以就会出现上图红色部分,System.StringComparison.Ordinal参数,也是让字符串操作回归来的方式,方便适配原来的逻辑。

这样一来5.0之后的版本就统一了各系统中的差异,让应用在切换系统部署时保持一致的运行逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值