.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之后的版本就统一了各系统中的差异,让应用在切换系统部署时保持一致的运行逻辑。
想要更快更方便的了解相关知识,可以关注微信公众号

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2017-02-21 数组,一维数组,二维数组,交错数组